Java移除無效括號(hào)的方法實(shí)現(xiàn)
一、題目
給你一個(gè)由 ‘('、')' 和小寫字母組成的字符串 s。
你需要從字符串中刪除最少數(shù)目的 ‘(' 或者 ‘)' (可以刪除任意位置的括號(hào)),使得剩下的「括號(hào)字符串」有效。
有效「括號(hào)字符串」應(yīng)當(dāng)符合以下 任意一條 要求:
空字符串或只包含小寫字母的字符串
可以被寫作 AB(A 連接 B)的字符串,其中 A 和 B 都是有效「括號(hào)字符串」
可以被寫作 (A) 的字符串,其中 A 是一個(gè)有效的「括號(hào)字符串」
二、示例
))(( -》 (leetode -》 leetode leetode) -》 leetode (lee(to)de -》 lee(to)de lee(to)de) -》 lee(to)de (lee(t(c)o)de -》 lee(t(c)o)de lee(t(c)o)de) -》 lee(t(c)o)de
三、解法1
public class Test {
public static void main(String[] args) {
String s1 = "))((";
System.out.println(s1 + " -》 " + minRemoveToMakeValid(s1));
String s2 = "(leetode";
System.out.println(s2 + " -》 " + minRemoveToMakeValid(s2));
String s3 = "leetode)";
System.out.println(s3 + " -》 " + minRemoveToMakeValid(s3));
String s4 = "(lee(to)de";
System.out.println(s4 + " -》 " + minRemoveToMakeValid(s4));
String s5 = "lee(to)de)";
System.out.println(s5 + " -》 " + minRemoveToMakeValid(s5));
String s6 = "(lee(t(c)o)de";
System.out.println(s6 + " -》 " + minRemoveToMakeValid(s6));
String s7 = "lee(t(c)o)de)";
System.out.println(s7 + " -》 " + minRemoveToMakeValid(s7));
}
public static String minRemoveToMakeValid(String str) {
// 初始化"("和")"的個(gè)數(shù)為0
int left = 0;
int right = 0;
// 將字符串轉(zhuǎn)換為char數(shù)組
char[] chars = str.toCharArray();
// 從左到右標(biāo)記多余的")"右括號(hào)
for (int i = 0; i < chars.length; i++) {
if (chars[i] == '(') {
left++;
} else if (chars[i] == ')') {
right++;
}
if (right > left) {
chars[i] = '#';
left = right = 0;
}
}
left = right = 0;
// 從右到左標(biāo)記多余的"("左括號(hào)
for (int i = chars.length - 1; i >= 0; i--) {
if (chars[i] == '(') {
left++;
} else if (chars[i] == ')') {
right++;
}
if (right < left) {
chars[i] = '#';
left = right = 0;
}
}
return String.valueOf(chars).replaceAll("#", "");
}
}
四、解法2
Stack.peek 與Sstack.pop 的區(qū)別
- 相同點(diǎn):大家都返回棧頂?shù)闹怠?/li>
- 不同點(diǎn):peek 不改變棧的值(不刪除棧頂?shù)闹?,pop會(huì)把棧頂?shù)闹祫h除。
public class Test {
public static void main(String[] args) {
String s1 = "))((";
System.out.println(s1 + " -》 " + minRemoveToMakeValid(s1));
String s2 = "(leetode";
System.out.println(s2 + " -》 " + minRemoveToMakeValid(s2));
String s3 = "leetode)";
System.out.println(s3 + " -》 " + minRemoveToMakeValid(s3));
String s4 = "(lee(to)de";
System.out.println(s4 + " -》 " + minRemoveToMakeValid(s4));
String s5 = "lee(to)de)";
System.out.println(s5 + " -》 " + minRemoveToMakeValid(s5));
String s6 = "(lee(t(c)o)de";
System.out.println(s6 + " -》 " + minRemoveToMakeValid(s6));
String s7 = "lee(t(c)o)de)";
System.out.println(s7 + " -》 " + minRemoveToMakeValid(s7));
}
public static String minRemoveToMakeValid(String str) {
// 記錄要?jiǎng)h除括號(hào)的下標(biāo),然后從后往前刪除坐標(biāo)
StringBuffer result = new StringBuffer(str);
Stack<Integer> stack = new Stack<>();
ArrayList<Integer> deleteRes = new ArrayList<>();
for (int i = 0; i < str.length(); i++) {
if (str.charAt(i) == '(') {
stack.push(i);
} else if (str.charAt(i) == ')') {
if (stack.empty()) {
deleteRes.add(i);
} else if (str.charAt(stack.peek()) == '(') {
stack.pop();
}
}
}
while (!stack.empty()) {
int temp = stack.peek();
stack.pop();
deleteRes.add(0, temp);
}
deleteRes.sort(Integer::compareTo);
for (int i = deleteRes.size() - 1; i >= 0; i--) {
result.deleteCharAt(deleteRes.get(i));
}
return result.toString();
}
}
到此這篇關(guān)于Java移除無效括號(hào)的方法實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Java移除無效括號(hào)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- java括號(hào)匹配算法求解(用棧實(shí)現(xiàn))
- java去除中文括號(hào)小括號(hào),或者英文括號(hào)的實(shí)例代碼
- Java Json字符串的雙引號(hào)("")括號(hào)如何去掉
- Java List集合返回值去掉中括號(hào)(''[ ]'')的操作
- Java棧的應(yīng)用之括號(hào)匹配算法實(shí)例分析
- 使用Java的方式模擬Flutter的Widget實(shí)現(xiàn)多層括號(hào)嵌套
- java正則表達(dá)式獲取大括號(hào)小括號(hào)內(nèi)容并判斷數(shù)字和小數(shù)親測(cè)可用
- Java 括號(hào)匹配問題案例詳解
相關(guān)文章
Java利用反射自動(dòng)封裝成實(shí)體對(duì)象的方法
這篇文章主要介紹了Java利用反射自動(dòng)封裝成實(shí)體對(duì)象的方法,可實(shí)現(xiàn)自動(dòng)封裝成bean對(duì)象功能,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-01-01
Java?8函數(shù)式接口之Consumer用法示例詳解
這篇文章主要為大家介紹了Java?8函數(shù)式接口之Consumer用法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07
Spring?Boot使用線程池處理上萬條數(shù)據(jù)插入功能
這篇文章主要介紹了Spring?Boot使用線程池處理上萬條數(shù)據(jù)插入功能,使用步驟是先創(chuàng)建一個(gè)線程池的配置,讓Spring Boot加載,用來定義如何創(chuàng)建一個(gè)ThreadPoolTaskExecutor,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友參考下吧2022-08-08
Java實(shí)例化一個(gè)抽象類對(duì)象的方法教程
大家都知道抽象類無法實(shí)例化,就無法創(chuàng)建對(duì)象。所以下面這篇文章主要給大家介紹了關(guān)于Java實(shí)例化一個(gè)抽象類對(duì)象的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2017-12-12
Mybatis中實(shí)體類屬性與數(shù)據(jù)列表間映射方法介紹
這篇文章主要介紹了Mybatis中實(shí)體類屬性與數(shù)據(jù)列表間映射方法介紹,一共四中方法,供大家參考。2017-10-10
SpringBoot中的ThreadLocal保存請(qǐng)求用戶信息的實(shí)例demo
線程局部變量,創(chuàng)建一個(gè)線程變量后,針對(duì)這個(gè)變量可以讓每個(gè)線程擁有自己的變量副本,每個(gè)線程是訪問的自己的副本,與其他線程的相互獨(dú)立,本文介紹SpringBoot中的ThreadLocal保存請(qǐng)求用戶信息,需要的朋友可以參考下2024-05-05
SpringBoot集成netty實(shí)現(xiàn)websocket通信功能
Netty是一個(gè)高性能、異步事件驅(qū)動(dòng)的網(wǎng)絡(luò)應(yīng)用框架,用于快速開發(fā)可維護(hù)的高性能協(xié)議服務(wù)器和客戶端,WebSocket 是一種網(wǎng)絡(luò)通信協(xié)議,相比傳統(tǒng)的HTTP協(xié)議,本文給大家介紹了SpringBoot集成netty實(shí)現(xiàn)websocket通信功能,需要的朋友可以參考下2024-03-03
詳解Java 反射和反射的應(yīng)用場(chǎng)景
這篇文章主要介紹了Java 反射和反射的應(yīng)用場(chǎng)景的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)Java反射的相關(guān)知識(shí),感興趣的朋友可以了解下2020-08-08

