【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;
}