【leetcode 003】Longest Palindromic Substring || ZigZag Conversion

【005 Longest Palindromic Substring 】


题目大意:给出一个字符串S,找到一个最长的连续回文串(是一个正读和反读都一样的字符串,比如“level”或者“noon”等等就是回文串)。

class Solution{
public:
	string longestPalindrome(string s){

		int sz = s.size();
		int countLen = 1;
		int index = 0;
		int indexLen = 0;
		int maxLen = 1;
		string res;

		while (countLen < sz)
		{
			countLen++;

			for (int i = 0; i < sz; i++)
			{
				if ((i + countLen) > s.size())
					break;

				if (judgeStr(s, i, countLen))
				{
					index = i;
					indexLen = countLen;
					break;
				}

			}

			if (indexLen > maxLen)
				maxLen = indexLen;
		}

		res.assign(s, index, maxLen);
		return res;
	}

	int judgeStr(string s, int iStart, int countLen){

		int compareCount = 0;
		int temp = countLen;

		for (int i = 0; i < countLen / 2; i++)
		{
			if (s[iStart] == s[iStart + temp - 1])
			{
				compareCount++;
				if (compareCount == (countLen / 2))
				{
					return 1;
				}
			}
			else
				return 0;

			iStart++;
			temp = temp - 2;
		}
	}
};

【006 ZigZag Conversion】

题目大意:一个字符串以ZigZag形式存储,存储的形式如下图:

比如我们题目中的例子"PAYPALISHIRING"的存储形式,题目的输出是按行来拼接字符的。遇到这种问题不用慌张,举例子找到数学规律即可。通过画图观察我们可以得到:

第0行和最后一行中,前一个下标的值和后一个下标的值相差 2 * nRows - 2 ,以第0行为例,前一个下标为0,后一个下标为 0+2*4-2=6。

 中间行中,前一个下标的值和后一个下标的值需要根据这个下标是该行中的奇数列还是偶数列来计算。以平时的习惯来计算,因此,行和列的开始值都是0。

以第2行为例,第一个下标是2,后一个下标所处列为1,是奇数列,因此从这个下标到下一个下标相差的值是它们所处的行i下面的所有行的点的个数,即2 * (nRows - 1 - i)。在这里,nRows-1是为了遵循0下标开始的原则。这样,我们可以求得这个奇数列的下标为 2+2*(4-1-2)=4。同理,当我们要计算4之后的下标时,我们发现下一个所处的是偶数列2,从这个下标到下一个下标相差的值其实是它们所处的行i上面的所有行的点的个数,即2 * i。因此,该列的下标计算为4+2*2=8。

#include <iostream>
#include <string>
using namespace std;

class Solution {
public:
	string convert(string s, int nRows) {
		// IMPORTANT: Please reset any member data you declared, as  
		// the same Solution instance will be reused for each test case.    

		if (nRows <= 1 || s.length() == 0)
			return s;

		string res = "";
		int len = s.length();
		for (int i = 0; i < len && i < nRows; ++i)
		{
			int indx = i;
			res += s[indx];

			for (int k = 1; indx < len; ++k)
			{
				//第一行或最后一行,使用公式1:  
				if (i == 0 || i == nRows - 1)
				{
					indx += 2 * nRows - 2;
				}
				//中间行,判断奇偶,使用公式2或3  
				else
				{
					if (k & 0x1)  //奇数位  
						indx += 2 * (nRows - 1 - i);
					else indx += 2 * i;
				}

				//判断indx合法性  
				if (indx < len)
				{
					res += s[indx];
				}
			}
		}
		return res;
	}
};

int main(){

	string str = "PAYPALISHIRING";

	Solution s;
	cout<<s.convert(str,3);

	system("pause");
	return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

余莫星辰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值