【題目描述】
有效括號(hào)字符串為空 ("")、"(" + A + ")" 或 A + B,其中 A 和 B 都是有效的括號(hào)字符串,+ 代表字符串的連接。例如,"","()","(())()" 和 "(()(()))" 都是有效的括號(hào)字符串。
如果有效字符串 S 非空,且不存在將其拆分為 S = A+B 的方法,我們稱其為原語(yǔ)(primitive),其中 A 和 B 都是非空有效括號(hào)字符串。
給出一個(gè)非空有效字符串 S,考慮將其進(jìn)行原語(yǔ)化分解,使得:S = P_1 + P_2 + ... + P_k,其中 P_i 是有效括號(hào)字符串原語(yǔ)。
對(duì) S 進(jìn)行原語(yǔ)化分解,刪除分解中每個(gè)原語(yǔ)字符串的最外層括號(hào),返回 S 。
【示例1】
輸入:"(()())(())"
輸出:"()()()"
解釋:
輸入字符串為 "(()())(())",原語(yǔ)化分解得到 "(()())" + "(())",
刪除每個(gè)部分中的最外層括號(hào)后得到 "()()" + "()" = "()()()"。
【示例2】
輸入:"(()())(())(()(()))"
輸出:"()()()()(())"
解釋:
輸入字符串為 "(()())(())(()(()))",原語(yǔ)化分解得到 "(()())" + "(())" + "(()(()))",
刪除每隔部分中的最外層括號(hào)后得到 "()()" + "()" + "()(())" = "()()()()(())"。
【示例3】
輸入:"()()"
輸出:""
解釋:
輸入字符串為 "()()",原語(yǔ)化分解得到 "()" + "()",
刪除每個(gè)部分中的最外層括號(hào)后得到 "" + "" = ""。
【提示】
S.length <= 10000
S[i] 為 "(" 或 ")"
S 是一個(gè)有效括號(hào)字符串
【思路】
1、想辦法把一個(gè)有效字符串分裂成若干有效字符串;
2、然后把每一個(gè)有效字符串去除頭和尾;
3、把若干去除頭和尾的字符串拼接,最后返回;
4、由一個(gè)整形變量num來(lái)記錄當(dāng)一個(gè)字符等于"("時(shí),num+=1;num==0時(shí),一個(gè)有效字符串遍歷完結(jié);
5、當(dāng)字符等于")"時(shí),num-=1,這時(shí)如果num>0,依然要append該字符;
6、也可使用棧實(shí)現(xiàn);
【Swift代碼實(shí)現(xiàn)】
func removeOuterParentheses(_ S: String) -> String {
var num = Int()
var index = Int()
var strings = [String]()
var remainString = String.init(S)
for cha in S {
if(cha == "(") {
num+=1
} else if(cha == ")") {
num-=1
}
index+=1
if(num == 0) {
strings.append(String(remainString.prefix(index)))
remainString.removeFirst(index)
index = 0
}
}
var result = String()
for var str in strings {
str.removeLast()
str.removeFirst()
result.append(str)
}
return result
}
優(yōu)化:
func removeOuterParentheses(_ S: String) -> String {
var num = Int()
var result = String()
for cha in S {
if(cha == "(") {
num+=1
if(num > 1) {
result.append(cha)
}
} else if(cha == ")") {
num-=1
if(num > 0) {
result.append(cha)
}
}
}
return result
}