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

posted on 2017-05-14 09:42  Sempron2800+  阅读(174)  评论(0编辑  收藏  举报