递归函数中的Python类变量

时间:2018-11-14 18:44:34

标签: python variables recursion class-variables

class Solution(object):
    def decode(self, s):
        sub_s = ""
        while self.i < len(s) and s[self.i] != "]":
            if not s[self.i].isdigit():
                sub_s += s[self.i]
                self.i += 1
            else:
                n = 0
                while self.i < len(s) and s[self.i].isdigit():
                    n = n * 10 + int(s[self.i])
                    self.i += 1
                self.i += 1
                seq = self.decode(s)
                self.i += 1
                sub_s += seq * n
        return sub_s

    def decodeString(self, s):
        self.i = 0
        return self.decode(s)

我正在研究leetcode问题394解码字符串问题,问题是转换字符串。

  • s =“ 3 [a] 2 [bc]”,返回“ aaabcbc”。
  • s =“ 3 [a2 [c]]”,返回“ accaccacc”。
  • s =“ 2 [abc] 3 [cd] ef”,返回“ abcabccdcdcdef”。

以上解决方案是Python版本,该版本是从作者bluedawnstar cpp解决方案翻译而来的。

self.i在整个递归过程中都保持全局状态,是否有更Python化的方法来维护此类变量而不是使用self

2 个答案:

答案 0 :(得分:2)

您可以改用以下函数,而无需使用类变量:

def decode(s):
    repeat = output = ''
    index = 0
    while index < len(s):
        char = s[index]
        index += 1
        if char.isdigit():
            repeat += char
        elif char == '[':
            substring, offset = decode(s[index:])
            output += substring * int(repeat)
            index += offset
            repeat = ''
        elif char == ']':
            break
        else:
            output += char
    return output, index

def decodeString(s):
    return decode(s)[0]

这样:

print(decodeString("3[a]2[bc]"))
print(decodeString("3[a2[c]]"))
print(decodeString("2[abc]3[cd]ef"))

输出:

aaabcbc
accaccacc
abcabccdcdcdef

答案 1 :(得分:0)

这是一种完美的方法。

但这并不是真正的“全球”;它仅限于该类实例。如果您有该类的两个实例,则每个实例将具有自己的self.i单独副本。