public class Solution { public IList<string> GenerateParenthesis(int n) { List<string> list = new List<string>(); backtrack(list, "", 0, 0, n); return list; } private void backtrack(List<String> list, String str, int open, int close, int max) { if (str.Length == max * 2) { list.Add(str); return; } if (open < max) { backtrack(list, str + "(", open + 1, close, max); } if (close < open) { backtrack(list, str + ")", open, close + 1, max); } } }
https://leetcode.com/problems/generate-parentheses/#/description
重新实现了一遍,也是使用回溯法。先使用python来做,本地测试正常,但是在leetcode上提交却WA,于是把python代码改写为C#,则AC了。
因此判断是OJ对python的代码判定有些问题,暂时不知道是什么原因。之前做题时,用CPP的代码也会出现这种问题,换成Java或C#则能正常AC。
现在把C#的正常AC的代码先贴出来:
1 public class Solution 2 { 3 private List<string> list = new List<string>(); 4 5 private void BackTrack(int L, int R, int n, string str) 6 { 7 if (L >= R && L < n) 8 { 9 BackTrack(L + 1, R, n, str + '('); 10 if (L > R) 11 { 12 BackTrack(L, R + 1, n, str + ')'); 13 } 14 } 15 16 else if( L> R && L== n) 17 { 18 BackTrack(L, R + 1, n, str + ')'); 19 } 20 else if (L == n && R == n) 21 { 22 list.Add(str); 23 } 24 } 25 26 public IList<string> GenerateParenthesis(int n) 27 { 28 string str = "("; 29 int L = 1; 30 int R = 0; 31 BackTrack(L, R, n, str); 32 return list; 33 } 34 }
下面是python的实现,这个和上面的C#的使用的是同样的逻辑,但是WA。
1 class Solution: 2 y=list()#结果集合 3 def generateParenthesis(self, n: 'int') -> 'List[str]': 4 string = '(' 5 L = 1#左括号数量 6 R = 0#右括号数量 7 self.BackTrack(L,R,n,string) 8 return self.y 9 10 def BackTrack(self,L,R,n,string): 11 #print('L='+str(L)+'|R='+str(R)+'|string='+string) 12 if L>=R and L<n: 13 self.BackTrack(L+1,R,n,string+'(') 14 if L > R: 15 self.BackTrack(L,R+1,n,string+')') 16 elif L>R and L==n: 17 self.BackTrack(L,R+1,n,string+')') 18 elif L == R == n: 19 self.y.append(string) 20 else: 21 return 22 return
错误信息如下:
经过实验,是全局变量self.y中的数据造成的影响,于是把y改为局部变量,就可以正常提交了:
1 class Solution: 2 def generateParenthesis(self, n: 'int') -> 'List[str]': 3 y=list() 4 string = '(' 5 L = 1#左括号数量 6 R = 0#右括号数量 7 self.BackTrack(L,R,n,string,y) 8 return y 9 10 def BackTrack(self,L,R,n,string,y): 11 if L == R == n: 12 y.append(string) 13 elif L == n and R < n: 14 self.BackTrack(L,R+1,n,string + ')',y) 15 elif L < n and R < n: 16 self.BackTrack(L+1,R,n,string + '(',y) 17 if L > R: 18 self.BackTrack(L,R+1,n,string + ')',y) 19 return