题意:给你一个字符串,让你判断这个字符串是否合法。
"112358"合法,因为
1 + 1 = 2, 1 + 2 = 3, 2 + 3 = 5, 3 + 5 = 8
“
199100199
”合法,因为
1 + 99 = 100, 99 + 100 = 199
注意1:数字没有前导0,所以1,02,3是不合法的。
注意2:数字可能爆int,所以这里用string比较大小。
思路:
1:要确定是否能成立,肯定要爆搜所有点,这里肯定要dfs。那么dfs要怎么搜呢?
bool dfs(int pos, string pre1, string pre2, string now, string num)
pre1是第一个数字,pre2是第二个数字,now是当前数字;
如果pre1+pre2 == now 那么能成立,pre1 = pre2,pre2 = now,继续搜
如果pre1+pre2 > now 那么now往后再加一位再比较
如果pre1+pre2 < now 那么可能不成立,直接返回不行。
2:递归初始条件:
pre1,pre2的初始状态肯定要合法,不能有前导0;
pre1,pre2的状态肯定要全部遍历;
pre1为:0-i;
pre2为: i+1-j;
3: 递归结束条件:
搜到最后一个字符,如果 now == "";返回true
4.字符串大小比较
用三个栈来实现,稍微模拟一下就好。
bool legal(string str)//判断是否合法
bool isAdditiveNumber(string num) //爆搜初始状态的确立
int cmp(string str1, string str2, string str3)//比较str1+str2 和 str3 的大小
bool dfs(int pos, string pre1, string pre2, string now, string num)//爆搜过程
具体代码实现:
class Solution {
public:
bool legal(string str)
{
if (str[0] == '0')
{
if (str.size() == 1) return true;
return false;
}
return true;
}
bool isAdditiveNumber(string num) {
if (num.size() <= 2) return false;
string pre1 = "";
string pre2 = "";
for (int i = 0; i<num.size() - 2; i++)
{
pre1 = pre1 + num[i];
pre2 = "";
if (legal(pre1))
{
for (int j = i + 1; j < num.size() - 1; j++)
{
pre2 = pre2 + num[j];
if (legal(pre2))
{
bool result = dfs(j + 1, pre1, pre2, "", num);
if (result)
return true;
}
else
break;
}
}
else
break;
}
return false;
}
int cmp(string str1, string str2, string str3)
{
stack<char> num1;
stack<char> num2;
stack<char> num3;
string result = "";
for (int i = 0; i<str1.size(); i++) num1.push(str1[i]);
for (int i = 0; i<str2.size(); i++) num2.push(str2[i]);
int flag = 0;
int num;
while (!num1.empty() && !num2.empty())
{
num = flag + num1.top() - '0' + num2.top() - '0';
num3.push(num % 10 + '0');
flag = num / 10;
num1.pop();
num2.pop();
}
while (!num1.empty())
{
num = flag + num1.top() - '0';
num3.push(num % 10 + '0');
flag = num / 10;
num1.pop();
}
while (!num2.empty())
{
num = flag + num2.top() - '0';
num3.push(num % 10 + '0');
flag = num / 10;
num2.pop();
}
if (flag) num3.push(flag + '0');
while (!num3.empty())
{
result += num3.top();
num3.pop();
}
if (result == str3)
return 0;
if (result.size() > str3.size())
return 1;
else if (result.size() < str3.size())
return -1;
else if (result.size() == str3.size())
return result > str3?1:-1;
}
bool dfs(int pos, string pre1, string pre2, string now, string num)
{
bool result = false;
if (pos == num.size())
{
if (now == "") return true;
return false;
}
now = now + num[pos];
if (legal(now))
{
int judge = cmp(pre1, pre2, now);
if (judge > 0) result = dfs(pos + 1, pre1, pre2, now, num);
else if (judge == 0) result = dfs(pos + 1, pre2, now, "", num);
}
return result;
}
};
本来以为我做不出来了,没想做最后的最后还是给我搞出来了!啊哈哈哈!