您的位置:首页 > 编程语言

编程系列之:最长回文子串问题

2008-04-04 09:22 281 查看
问题:
给定一个字符串,找出其中的最长回文子串长度。
例如:abccbabcddcba,最长的为abcddcba,长度为8

解决:
用栈,遇到与栈顶不同的字符,压栈;
否则,弹栈并比较下一个字符与栈顶的是否相同,相同继续弹栈;
记录弹了多少个,乘二,更新最长回文子串长度max;

/***
* starstarstarpku@gmail.com
* 20080404
*
* 找到给定字符串中最长的回文串长度。
* 例如:
* abccbabcddcba
* 最长的回文串是abcddcba长度为8
*/

#include <stdio.h>
#include <string.h>
#include "../../data_structure/stack/include/sim_stack.h"

#define BUFFSIZE 512
void solve (const char *p)
{
SimStack<char> stack;
/**
* 使用栈,如果当前字符与栈顶字符不同,则压栈;
* 遇到相同的字符,弹栈并顺次比较直到不再相同,
* 同时记录弹的字符数m;
* 回压栈m个字符。
* 继续压栈;
*/
int n = strlen(p);
int maxlen = 0;
for (int i=0; i<n; ) {
if (stack.size() <= 0 || stack.top() != p[i]) {
stack.push(p[i]);
i++;
continue;
}

int index_bk = i;
int popnum = 0;
while (stack.size() > 0 && i < n && stack.top() == p[i]) {
stack.pop();
i++;
popnum++;
}
// 记录最长回文子串长度
if (2*popnum > maxlen) {
maxlen = 2*popnum;
}
// 回压栈
for (int j=index_bk-popnum; j<index_bk+popnum; j++) {
stack.push (p[j]);
}
}
printf ("longest huiwen string length is: %d/n", maxlen);
}

int main (int argc, char **argv)
{
char str[BUFFSIZE];
printf ("input a str: /n");
scanf ("%s", str);
solve (str);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: