Given two strings S
and T
, each of which represents a non-negative rational number, return True if and only if they represent the same number. The strings may use parentheses to denote the repeating part of the rational number.
In general a rational number can be represented using up to three parts: an integer part, a non-repeating part, and a repeating part. The number will be represented in one of the following three ways:
(e.g. 0, 12, 123)<.>
(e.g. 0.5, 1., 2.12, 2.0001)<.><(><)>
(e.g. 0.1(6), 0.9(9), 0.00(1212))The repeating portion of a decimal expansion is conventionally denoted within a pair of round brackets. For example:
1 / 6 = 0.16666666... = 0.1(6) = 0.1666(6) = 0.166(66)
Both 0.1(6) or 0.1666(6) or 0.166(66) are correct representations of 1 / 6.
Example 1:
Input: S = "0.(52)", T = "0.5(25)"
Output: true
Explanation:
Because "0.(52)" represents 0.52525252..., and "0.5(25)" represents 0.52525252525..... , the strings represent the same number.
Example 2:
Input: S = "0.1666(6)", T = "0.166(66)"
Output: true
Example 3:
Input: S = "0.9(9)", T = "1."
Output: true
Explanation:
"0.9(9)" represents 0.999999999... repeated forever, which equals 1. [See this link for an explanation.]
"1." represents the number 1, which is formed correctly: (IntegerPart) = "1" and (NonRepeatingPart) = "".
Note:
will not begin with 2 or more zeros. (There is no other restriction on the digits of each part.)1 <= .length <= 4
0 <= .length <= 4
1 <= .length <= 4
思路:把小数展开,没有循环的强行加(0)弄成循环,这样统一处理方便一点。
为了方便处理,尽量多展开一点,下面是展开100次,然后取前90个字符出来比较。需要注意1与0.(9)这种情况
class Solution:
def isRationalEqual(self, S, T):
"""
:type S: str
:type T: str
:rtype: bool
"""
if '.' not in S: S+='.0'
if '.' not in T: T+='.0'
if '(' not in S: S+='(0)'
if '(' not in T: T+='(0)'
idx=S.index('(')
s0=S[:idx]
s1=S[idx+1:len(S)-1]
for _ in range(100):
s0+=s1
idx=T.index('(')
t0=T[:idx]
t1=T[idx+1:len(T)-1]
for _ in range(100):
t0+=t1
s0,t0=s0[:90],t0[:90]
if s0==t0: return True
s=0
while s0[s]==t0[s]: s+=1
if s+1
不太擅长做这种很多边界的题,很烦,一直debug