Java移除無(wú)效括號(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移除無(wú)效括號(hào)的方法實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Java移除無(wú)效括號(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)匹配問(wèn)題案例詳解
相關(guān)文章
Jedis操作Redis數(shù)據(jù)庫(kù)的方法
這篇文章主要為大家詳細(xì)介紹了Jedis操作Redis數(shù)據(jù)庫(kù)的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-04-04
Spring?Validation實(shí)現(xiàn)數(shù)據(jù)校驗(yàn)的示例
Spring?Validation其實(shí)就是對(duì)Hibernate?Validator進(jìn)一步的封裝,方便在Spring中使用,這篇文章主要介紹了Spring?Validation實(shí)現(xiàn)數(shù)據(jù)校驗(yàn)的示例,需要的朋友可以參考下2023-03-03
Java對(duì)象傳遞與返回的細(xì)節(jié)問(wèn)題詳析
我們知道這是一個(gè)核心概念,在Java中總是按值傳遞而不是按引用傳遞,下面這篇文章主要給大家介紹了關(guān)于Java對(duì)象傳遞與返回的細(xì)節(jié)問(wèn)題的相關(guān)資料,需要的朋友可以參考下2022-11-11
java實(shí)現(xiàn)在原有日期時(shí)間上加幾個(gè)月或幾天
這篇文章主要介紹了java實(shí)現(xiàn)在原有日期時(shí)間上加幾個(gè)月或幾天,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-10-10
理解 MyBatis 是如何在 Spring 容器中初始化的
這篇文章主要介紹了理解 MyBatis 是如何在 Spring 容器中初始化的,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11
Java小程序賽馬游戲?qū)崿F(xiàn)過(guò)程詳解
這篇文章主要介紹了Java小程序賽馬游戲?qū)崿F(xiàn)過(guò)程詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-03-03
淺談SpringMVC的攔截器(Interceptor)和Servlet 的過(guò)濾器(Filter)的區(qū)別與聯(lián)系 及Spr
這篇文章主要介紹了淺談SpringMVC的攔截器(Interceptor)和Servlet 的過(guò)濾器(Filter)的區(qū)別與聯(lián)系 及SpringMVC 的配置文件,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07
解決mybatis plus報(bào)錯(cuò)Invalid bound statement
在使用MyBatis時(shí)遇到InvalidBoundStatement異常,常因多個(gè)MapperScan配置沖突或者包掃描路徑設(shè)置錯(cuò)誤,解決方法包括保留一個(gè)MapperScan聲明、檢查jar包沖突、確保命名空間和掃描路徑正確,使用@TableId注解指定主鍵2024-11-11

