我一开始以为可以用回文做,后来发现还是有一点不同的,并不是完全对称的。要想实现O(n)的复杂度,只要遍历一次,我没想到不添加多余空间办法,只是想到正常思路,用时4ms,低于100%的提交记录。
思路:首先是对偶性,如果不是成对出现,一定是错的,其次会出现一层套一层的情况。那么就想开辟一个空间,遍历整个字符,依次添加到空间中,每一个字符看是否在空间的最后找到另一半,没找到就添加到空间中,找到了,就释放这一对,如果最后空间中还有剩的,要么是多出的单个字符,要么是错开嵌套的字符。
class Solution {
public boolean isValid(String s) {
if (s == "") return true;
char[] arr = s.toCharArray();
List<Character> ls = new ArrayList<>();
for (int i = 0; i < arr.length; i ++) {
if (!ls.isEmpty()) {
if (charCom(ls.get(ls.size() - 1), arr[i])) {
ls.remove(ls.size() - 1);
continue;
}
}
ls.add(arr[i]);
}
if (ls.isEmpty()) return true;
else return false;
}
public boolean charCom(char x, char y) {
if (x == '(' && y == ')') return true;
else if (x == '[' && y == ']') return true;
else if (x == '{' && y == '}') return true;
else return false;
}
}
再用python3实现一遍,发现不是最快,用时52ms,应该是写法的问题,代码如下:
class Solution:
def isValid(self, s: str) -> bool:
if (s == ''):
return True
arr = list(s)
ls =[]
for each in arr:
if (len(ls)):
if (Solution.charCom(ls[len(ls) - 1], each)):
ls.pop()
continue
ls.append(each)
if (len(ls) == 0):
return True
else:
return False
def charCom(x, y):
if (x == '(' and y == ')'):
return True
elif (x == '[' and y == ']'):
return True
elif (x == '{' and y == '}'):
return True
else:
return False
较好的python3用时36ms,思路差不多,但是更精炼:
class Solution(object):
def isValid(self, s):
if len(s) %2 != 0:
return False
lb = {'(':')','[':']','{':'}'}
stack =[]
for x in s:
if x in lb:
stack.append(x)
else:
if len(stack) == 0:
return False
top = stack.pop()
if lb[top] != x:
return False
return len(stack) == 0