码迷,mamicode.com
首页 > 其他好文 > 详细

LeetCode Decode Ways

时间:2014-06-05 03:36:48      阅读:231      评论:0      收藏:0      [点我收藏+]

标签:c   class   blog   code   a   int   

  有点意思的题目。用动态规划可以O(n)求解出来:a[i]代表子字符串string(0,i)的可能解码方式,a[i] = {a[i-1] or a[i-1]+a[i-2]}.

  意思是如果string(i)不为0,至少a[i] == a[i-1],即一种解码方法是string{0,.....(i-1)}+string(i); 

  然后如果string{i-1,i}是合法的(注意合法概念,比如11,12,20,但04就不合法),那么a[i] = a[i-1]+a[i-2],即还有一种解码方法是string{0,.....(i-2)}+string{i-1,i}

  另外值得注意是如果a[i]求出来为0,那就可以停止运行了,直接返回0,因为这个字符串没法被解码。


#include<iostream>
using namespace std;


class Solution {
public:
	int numDecodings(string s) {
		if (s == "")
			return 0;
		if (s.at(0) == '0')
			return 0;
		int len = s.size();
		int* a = new int[len];

		a[0] = 1;
		for (int i = 1; i < len; i++)
		{
			a[i] = 0;

			if (s.at(i) != '0')
				a[i] = a[i - 1];
			
			if (s.at(i - 1) != '0')
			{
				int val = (s.at(i - 1) - '0') * 10 + (s.at(i) - '0');
				if (val <= 26 && val > 0)
				{
					if (i >= 2)
						a[i] += a[i - 2];
					else
						a[i] += 1;
				}
			}

			if (a[i] == 0)
				return 0;
		}

		return a[len-1];
	}
};

int main()
{
	Solution sol;
	string s = "12004";

	cout << sol.numDecodings(s) << endl;
}


LeetCode Decode Ways,布布扣,bubuko.com

LeetCode Decode Ways

标签:c   class   blog   code   a   int   

原文地址:http://blog.csdn.net/tspatial_thunder/article/details/27147183

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!