回文算法一维数组c语言,回文算法

一、回文算法:

回文指从左往右和从由往左读到相同内容的文字。比如: aba,abba,level。

回文具有对称性。

回文算法的目标是把最长的回文从任意长度的文本当中寻找出来。比如:从123levelabc中寻找出level。

回文数C语言(Xcode实现)

#include

#include

int IsHuiWenShu( int );

int main(int argc, const char * argv[]) {

// insert code here...

printf("Hello, World!\n");

int num = 121;

int ret = IsHuiWenShu( num );

if (ret == 0)

{

printf( "The number %d is not huiwenshu.\n", num );

}

else

{

printf( "The number %d is huiwenshu.\n", num );

}

return 0;

}

int IsHuiWenShu( int number )

{

int res = 0;

int n = number;

// 小于0和10的倍数的都不是回文数

if (number < 0 || (number % 10 == 0 && number != 0))

{

return 0;

}

do

{

res = res * 10 + n % 10;

n = n / 10;

} while ( n );

/*

121

res = 0+1 = 1

n = 12

res = 1*10+2 = 12

n = 1

res = 12*10+1=121

n = 0

n = 0 循环结束

此时 x = 12 || x = 1

*/

printf("res = %d\n,---number--- = %d\n",res,number);

if ( res == number )

{

return 1;

}

return 0;

}

二、回文串C语言

通过定义一个s字符数组,gets函数控制输入

i、j双指针来回判断字符数组的位置,和对应位置的值的比较,

while循环的条件 i<=j&&s[i]==s[j]

最终判断i、j的关系,如果i<=j说明存在对应位置不等的情况就是不是回文串

#include

#include

#define N 100

int main(int argc, const char * argv[]) {

// insert code here...

printf("Hello, World!\n");

char s[N] = "bsfgb"; //改写版本 直接赋值限定大小

int i=0,j;

printf("Input a String: \n");

//输入一个字符串赋值给s

// gets(s) = ;

// char strs[N] = "batdb";

//j的初始值为s字符串最后一个位置

j=(int)strlen(s)-1;

//进行while判断i、j的位置和i、j位置的值的关系

while(i<=j&&s[i]==s[j]){

//每比较一次就i右移、j左移一位

i++;j--;

}

/*

0 <= 4 s[0]=b s[4]=b

1 <= 3 s[1]=b s[3]=b

2 <= 2 s[2]=d s[2]=d

3 > 1 结束 是回文最后是i > j

*/

//判断最终i和j的的位置

//根据i、j的位置最终是会互相超越的,所以如果i<=j说明存在对应位置不等的情况就是不是回文串

if (i<=j)

{

printf("不是回文字符串\n");

}

else{

printf("是回文字符串\n");

}

return 0;

}

Hello, World!

Input a String:

是回文字符串

Program ended with exit code: 0

三、最长回文子串

给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。

注意看实现思路

参考

输入: "babad"

输出: "bab"

注意: "aba" 也是一个有效答案。

输入: "cbbd"

输出: "bb"

解题思路:

中心扩展法:

每一个位置的字母都有可能是回文串的中心轴, 有三种可能:单轴/双轴左部/双轴右部

例如:

aba 此时的 b 就是作为单轴

cbbc 此时的 bb 就是作为双轴, 对每一个 b 细分, 就是第一个 b 就是双轴左部,第二个 b 就是双轴右部了

综合考虑一下, 发现双轴左/右只需要考虑到一个就可以

所以这里只考虑了作为单轴和作为双轴右部

解题思路:

1.双重for循环+判别回文串

2.单纯for循环+中心扩散法

3.动态规划

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值