如果字符串滿足以下條件之一,則可以稱之為 有效括號字符串(valid parentheses string,可以簡寫為 VPS):
字符串是一個空字符串 "",或者是一個不為 "(" 或 ")" 的單字符。
字符串可以寫為 AB(A 與 B 字符串連接),其中 A 和 B 都是 有效括號字符串 。
字符串可以寫為 (A),其中 A 是一個 有效括號字符串 。
類似地,可以定義任何有效括號字符串 S 的 嵌套深度 depth(S):
depth("") = 0
depth(C) = 0,其中 C 是單個字符的字符串,且該字符不是 "(" 或者 ")"
depth(A + B) = max(depth(A), depth(B)),其中 A 和 B 都是 有效括號字符串
depth("(" + A + ")") = 1 + depth(A),其中 A 是一個 有效括號字符串
例如:""、"()()"、"()(()())" 都是 有效括號字符串(嵌套深度分別為 0、1、2),而 ")(" 、"(()" 都不是 有效括號字符串 。
給你一個 有效括號字符串 s,返回該字符串的 s 嵌套深度 。
例子
輸入:s = "(1+(2*3)+((8)/4))+1"
輸出:3
解釋:數(shù)字 8 在嵌套的 3 層括號中。
輸入:s = "(1)+((2))+(((3)))"
輸出:3
輸入:s = "1+(2*3)/(2-1)"
輸出:1
輸入:s = "1"
輸出:0
解題思路
棧方法
題意不難理解, 留意下 "()" 這種就算1個深度
定義一個容器數(shù)組 temp
棧方法
判斷"(" 移入容器數(shù)組
判斷")" 先判斷深度其實(shí)就是數(shù)組元素最大值, 再最后"("移出容器數(shù)組
反復(fù)移入移出處理, 求得結(jié)果
(當(dāng)然, 我們也可以不用數(shù)組, 定義數(shù)字進(jìn)行加減操作, 判斷最大值也可)
未翻譯版
class Solution {
func maxDepth(_ s: String) -> Int {
var result = 0, temp:[Character] = []
for i in s {
if i == "(" {
temp.append(i)
}else if i == ")" {
result = max(result, temp.count)
temp.removeLast()
}
}
return result
}
}
翻譯版
class Solution {
func maxDepth(_ s: String) -> Int {
// 定義最后結(jié)果, 容器數(shù)組,
// 當(dāng)然我們也可以設(shè)置temp = 0, 后續(xù)通過 +1, -1進(jìn)行操作
var result = 0, temp:[Character] = []
// 循環(huán)s中每一個字符
for i in s {
// 如果 i == "(", temp移入 "("
if i == "(" {
temp.append(i)
// 如果 i == ")"
}else if i == ")" {
// 求最大值
result = max(result, temp.count)
// temp中最后項(xiàng)出棧
temp.removeLast()
}
}
// 返回結(jié)果
return result
}
}
換計(jì)數(shù)法
func maxDepth(_ s: String) -> Int {
var result = 0, temp = 0
for i in s {
if i == "(" {
temp += 1
}else if i == ")" {
result = max(result, temp)
temp -= 1
}
}
return result
}
題目來源:力扣(LeetCode) 感謝力扣爸爸 :)
IOS 算法合集地址