对给定的字符串找到其中最长的回文子串,并返回最大长度和个数。
#pragma once
#include<iostream>
#include<string>
using namespace std;
const int MAXLEN = 22;
class SOL {
private:
string m_str;
int m_isTable[MAXLEN][MAXLEN];
public:
SOL() {}
SOL(string s) {
toSmall(s);
//test
//cout<<m_str<<endl;
setTable();
getTable();
}
~SOL() {}
void toSmall(string &s) {
int len = s.size();
m_str = "";
for (int i = 0; i < len; ++i) {
m_str += toLower(s[i]);
}
}
char toLower(char c) {
if(c >= 'A'&&c <= 'Z')
c+= 'a' - 'A';
return c;
}
void setTable() {
int size = m_str.size();
for (int i = 0; i < size; ++i) {
m_isTable[i][i] = 1;
if (i + 1 < size)
m_isTable[i][i + 1] = (m_str[i] == m_str[i + 1])? 1:0;
}
}
void getTable() {
int size = m_str.size();
for (int dir = 2; dir < size; dir++)
for (int hen = 0, lie = dir; hen < size&&lie < size; hen++, lie++) {
m_isTable[hen][lie] =isSym(hen,lie)? 1:0;
}
//test
/*
for(int i=0;i<size;i++){
for(int j=i;j<size;j++){
cout<<m_isTable[i][j]<<' ';
}
cout<<endl;
}*/
}
bool isSym(int i, int j) {
return m_isTable[i + 1][j - 1] && m_str[i] == m_str[j];
}
void countLongest() {
int maxlen = 0;
int count = 0;
bool get = false;
int size = m_str.size();
for (int dir = size - 1; !get&&dir >= 0; dir--)
for (int lie = dir, h = 0; lie < size&&h < size; h++, lie++) {
if (m_isTable[h][lie]) {
maxlen = lie - h + 1;
get = true;
count++;
}
}
cout << maxlen << " " << count << endl;
}
};
void testFor1() {
string str = "SBaAbacdccdc";
SOL sol(str);
sol.countLongest();
}
注意:
1. 函数三行原则
2. 复杂判断单独做函数
3. for循环内部最好一个事件
4. 可以阶段测试
void getTable() {
int size = m_str.size();
for (int dir = 2; dir < size; dir++)
for (int hen = 0, lie = dir; hen < size&&lie < size; hen++, lie++) {
m_isTable[hen][lie] =isSym(hen,lie)? 1:0;
}
//test
/*
for(int i=0;i<size;i++){
for(int j=i;j<size;j++){
cout<<m_isTable[i][j]<<' ';
}
cout<<endl;
}*/
}
bool isSym(int i, int j) {
return m_isTable[i + 1][j - 1] && m_str[i] == m_str[j];
}