Java移除無效括號的方法實(shí)現(xiàn)
一、題目
給你一個由 ‘('、')' 和小寫字母組成的字符串 s。
你需要從字符串中刪除最少數(shù)目的 ‘(' 或者 ‘)' (可以刪除任意位置的括號),使得剩下的「括號字符串」有效。
有效「括號字符串」應(yīng)當(dāng)符合以下 任意一條 要求:
空字符串或只包含小寫字母的字符串
可以被寫作 AB(A 連接 B)的字符串,其中 A 和 B 都是有效「括號字符串」
可以被寫作 (A) 的字符串,其中 A 是一個有效的「括號字符串」
二、示例
))(( -》 (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) {
// 初始化"("和")"的個數(shù)為0
int left = 0;
int right = 0;
// 將字符串轉(zhuǎn)換為char數(shù)組
char[] chars = str.toCharArray();
// 從左到右標(biā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)記多余的"("左括號
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會把棧頂?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) {
// 記錄要刪除括號的下標(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移除無效括號的方法實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Java移除無效括號內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring?Validation實(shí)現(xiàn)數(shù)據(jù)校驗(yàn)的示例
Spring?Validation其實(shí)就是對Hibernate?Validator進(jìn)一步的封裝,方便在Spring中使用,這篇文章主要介紹了Spring?Validation實(shí)現(xiàn)數(shù)據(jù)校驗(yàn)的示例,需要的朋友可以參考下2023-03-03
java實(shí)現(xiàn)在原有日期時間上加幾個月或幾天
這篇文章主要介紹了java實(shí)現(xiàn)在原有日期時間上加幾個月或幾天,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-10-10
理解 MyBatis 是如何在 Spring 容器中初始化的
這篇文章主要介紹了理解 MyBatis 是如何在 Spring 容器中初始化的,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11
淺談SpringMVC的攔截器(Interceptor)和Servlet 的過濾器(Filter)的區(qū)別與聯(lián)系 及Spr
這篇文章主要介紹了淺談SpringMVC的攔截器(Interceptor)和Servlet 的過濾器(Filter)的區(qū)別與聯(lián)系 及SpringMVC 的配置文件,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07
解決mybatis plus報錯Invalid bound statement
在使用MyBatis時遇到InvalidBoundStatement異常,常因多個MapperScan配置沖突或者包掃描路徑設(shè)置錯誤,解決方法包括保留一個MapperScan聲明、檢查jar包沖突、確保命名空間和掃描路徑正確,使用@TableId注解指定主鍵2024-11-11

