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:
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:
Note:
Each part consists only of digits.
The <IntegerPart> will not begin with 2 or more zeros. (There is no other restriction on the digits of each part.)
Input: S = "0.9(9)", T = "1."
Output: true
Explanation:
"0.9(9)" represents 0.999999999... repeated forever, which equals 1.
"1." represents the number 1, which is formed correctly: (IntegerPart) = "1" and
(NonRepeatingPart) = "".
class Solution {
public boolean isRationalEqual(String S, String T) {
double n1 = getDouble(S);
double n2 = getDouble(T);
return n1 == n2;
}
private double getDouble(String s) {
int repeatStart = s.indexOf('(') + 1;
String repeat = repeatStart == 0 ? "" : s.substring(repeatStart, s.length() - 1);
String nonRepeat = repeatStart == 0 ? s : s.substring(0, repeatStart - 1);
s = nonRepeat;
for (int i = 0; i < 20; ++i) {
s += repeat;
}
return Double.parseDouble(s);
}
}
class Solution {
public boolean isRationalEqual(String S, String T) {
S = expand(preProcess(S));
T = expand(preProcess(T));
for (int i = 0; i < 15; ++i) {
char cs = S.charAt(i);
char ct = T.charAt(i);
if (S.charAt(i) == T.charAt(i)) continue;
if (Math.abs(cs - ct) == 1) {
if (cs > ct) {
String m = T;
T = S;
S = m;
}
// 现在 S[i] == T[i] - 1
// 判断大数后面是否都是0,小数后面是否都是9,遇到都是'.'的情况跳过
for (int j = i + 1; j < 15; ++j) {
cs = S.charAt(j);
ct = T.charAt(j);
if (cs == '.' && ct == '.') continue;
else if (cs == '.' || ct == '.') return false;
if (cs != '9') return false;
if (ct != '0') return false;
}
return true;
} else {
return false;
}
}
return true;
}
// 将重复部分扩展到至少15位长
private String expand(String s) {
int repeatStart = s.indexOf('(') + 1;
String repeat = s.substring(repeatStart, s.length() - 1);
String nonRepeat = s.substring(0, repeatStart - 1);
s = nonRepeat;
while (s.length() < 15) {
s += repeat;
}
return s;
}
private String preProcess(String s) {
if (! s.contains(".")) s += ".0";
if (! s.contains("(")) s += "(0)";
return s;
}
}