您的位置:首页 > 其它

对称子字符串最大长度

2013-07-18 17:35 281 查看

前言

之前写了一篇文章,判断回文字串,见链接:http://blog.csdn.net/zinss26914/article/details/8063753, 确实写的够烂,欢迎吐槽。这次分享一个在O(n * n)时间复杂度内求对称字符串最大长度的代码

判断回文

先重写一个判断回文字串的方法,用指针实现,而不是数组了

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void isSymmetrical(char *str)
{
char *begin, *end;
int flag, len = strlen(str);

for (begin = str, end = str + len - 1, flag = 1; begin <= end; begin ++, end --) {
if (*begin != *end) {
flag = 0;
break;
}
}

if (flag)
printf("Yes!\n");
else
printf("No!\n");
}

int main(void)
{
char str[1001];

while (gets(str)) {
isSymmetrical(str);
}

return 0;
}

/**************************************************************
Problem: 1192
User: wangzhengyi
Language: C
Result: Accepted
Time:10 ms
Memory:912 kb
****************************************************************/

判断回文子串

判断子串是否为回文,可以考虑从内向外比较。例如字符串“google”,如果我们判断第二个字符o是对称的,只需要再向左、和向右各移一位就可以判断下一个字符串是否是对称的了
需要注意的一点是,针对原字符串中的每一个字符有两种情况:

以该字符为中心的对称分布,也就是回文子串为奇数
以该字符和该字符前一个字符为中心的对称分布,也就是说回文子串是偶数

时间复杂度分析:

外层需要n - 1层循环,内层对于每个字符,都由中间向两边遍历一遍,为n,因此总的时间复杂度为O(n * n)

题目

题目描述:
输入一个字符串,输出该字符串中对称的子字符串的最大长度。
比如输入字符串“google”,由于该字符串里最长的对称子字符串是“goog”,因此输出4。
输入:
存在多组数据,每组数据一行字符串,长度不大于100。
输出:
输出回文子串的最大长度。
样例输入:
google
样例输出:
4

ac代码

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

/**
* 最长回文字串的长度
*/
void maxSymmetricalSubstring(char *str)
{
int maxlength, len;
char *pre, *next, *current;

current = str + 1;
maxlength = 0;

while (*current != '\0') {
pre = current - 1;
next = current + 1;

while (pre >= str && *next != '\0' && *pre == *next) {
pre --;
next ++;
}

len = (next - 1) - (pre + 1) + 1;

if (len > maxlength) {
maxlength = len;
}

pre = current - 1;
next = current;

while (pre >= str && *next != '\0' && *pre == *next) {
pre --;
next ++;
}
len = (next - 1) - (pre + 1) + 1;

if (len > maxlength) {
maxlength = len;
}

current ++;
}

printf("%d\n", maxlength);
}

int main(void)
{
char str[101];

while (gets(str)) {
maxSymmetricalSubstring(str);
}

return 0;
}
/**************************************************************
Problem: 1252
User: wangzhengyi
Language: C
Result: Accepted
Time:0 ms
Memory:912 kb
****************************************************************/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: