题目如下:
解题思路:我用的是递归的方法,每次找出与第一个')'匹配的'('计算atom的数量后去除括号,只到分子式中没有括号为止。例如 "K4(ON(SO3)2)2" -> "K4(ONS2O6)2" -> "K4O2N2S4O12"。接下来再对分子式进行分割,得出每个atom的数量后排序即可。原理很简单,代码写得很乱,仅供参考。
代码如下:
class Solution(object): def recursive(self,formula): left = right = None for i,v in enumerate(formula): if v == '(': left = i elif v == ')': right = i break if left == None and right == None: return formula lf = formula[:left] parse = formula[left+1:right] times = '' for i in range(right+1,len(formula)): if formula[i].isdigit(): times += formula[i] else: if i != len(formula) - 1: i -= 1 break if times != '': times = int(times) rf = formula[i+1:] if times == '': ts = parse else: parseList = [] val = '' val_num = '' parse += '#' for i in parse: #print parseList if i.islower(): val += i #parseList.append(val) elif i.isupper(): if val != '': parseList.append(val) if val_num != '': parseList.append(str(int(val_num) * int(times))) val_num = '' elif val_num == '' and val != '': parseList.append(str(times)) val = i elif i.isdigit(): if val != '': parseList.append(val) val = '' val_num += i elif i == '#': if val != '': parseList.append(val) if val_num != '': parseList.append(str(int(val_num) * int(times))) elif val_num == '' and val != '': parseList.append(str(times)) ts = ''.join(parseList) return self.recursive(lf + ts + rf) def countOfAtoms(self, formula): """ :type formula: str :rtype: str """ f = self.recursive(formula) i = 1 #print f #transform MgO2H2 -> Mg1O2H2 while i < len(f): if f[i].isupper() and f[i-1].isdigit() == False: f = f[:i] + '1' + f[i:] i = 1 i += 1 if f[-1].isdigit() == False: f += '1' dic = {} key = '' val = '' # H11He49N1O35B7N46Li20 for i in f: if i.isdigit(): val += i else: if val == '': key += i else: if key not in dic: dic[key] = int(val) else: dic[key] += int(val) key = i val = '' if key not in dic: dic[key] = int(val) else: dic[key] += int(val) keys = dic.keys() keys.sort() res = '' #print dic for i in keys: res += i if dic[i] > 1: res += str(dic[i]) return res