您的位置:首页 > 编程语言 > C语言/C++

leetcode - Additive Number

2016-02-13 23:12 387 查看
题目:

https://leetcode.com/problems/additive-number/

class Solution {
public:

long long str2num(string str){
stringstream ss(str);
long long n;
ss >> n;
return n;
}

string num2str(long long i)
{
stringstream ss;
ss << i;
return ss.str();
}

bool isAdditiveNumber(string num) {
if (num.size()<3)
return false;
//0~i,i~j
for (int i = 1; i <= num.size() / 2; ++i)
{
if (i>1 && num[0] == '0')
return false;
for (int j = i + 1; j<num.size(); ++j)
{
int s1 = i, s2 = j - i, s3 = num.size() - s1 - s2;
if (max(s1, s2)>s3)
break;
string str1(num, 0, s1), str2(num, i, s2);
if (str2.size()>1 && str2[0] == '0')
break;
long long n1 = str2num(str1), n2 = str2num(str2);
pair<bool, unsigned int> res = judge(num, j, n1, n2);
if (res.first)
{
if (isAdditiveNumber_core(num, s1 + s2 + res.second, n2, n1 + n2))
return true;
}
}
}
return false;
}

bool isAdditiveNumber_core(string& num, int start, long long n1, long long n2)
{
if (start == num.size())
return true;
if (start>num.size())
return false;
pair<bool, unsigned int> res = judge(num, start, n1, n2);
if (res.first)
{
return isAdditiveNumber_core(num, start + res.second, n2, n1 + n2);
}
else
{
return false;
}
}

pair<bool, unsigned int> judge(string& num, int start, long long n1, long long n2)
{
string str3 = num2str(n1 + n2);
if (str3.size()>num.size() - start)
return make_pair(false, 0);
for (int i = 0; i<str3.size(); ++i)
{
if (str3[i] != num[start + i])
return make_pair(false, 0);
}
return make_pair(true, str3.size());
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c++ 程序员