leetcode 306. Additive Number

leetcode 306. Additive Number

题意:给你一个字符串,让你判断这个字符串是否合法。

"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;
	}
};
本来以为我做不出来了,没想做最后的最后还是给我搞出来了!啊哈哈哈!



阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Sea_muxixi/article/details/79973941
个人分类: LeetCode
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭