当前位置:首页 » 操作系统 » 回文字符串算法

回文字符串算法

发布时间: 2022-05-13 00:55:43

① 关于回文算法

这个函数不对奇偶长度的字符串都通用的 我给你稍微改了下 空都补上了
int IsHuiWen(char *s)
{
SeqStack T; // 定义一个顺序栈T
char t;
Init Stack(T); //初始化栈
l=strlen(s); //变量l的值为字符串长度
for(i=0;i <= l/2;i++) Push(&T,s[i]); //i<=l/2和后面的push 作用就是把字符串前半截压入栈结构
while(!EmptyStock(&T))
{
t=Pop(&T); //让元素出栈并且赋给t 用来和后面的字符比较
if(t != s[l-i]) //如果中间的2个字符不相同就返回0
{return 0;}
--i; //如果第一次比较相同就比较第二次 从中间向两边比较直到栈为空
} // 这个后面的while是多余的 没用
return 1;//比较完后都不返回0就是回文 返回1
}

② 使用栈判断给定字符串是否是回文的算法

#include <stdio.h>
#define SIZE 50
int isPalindrome(char str[]);
int elementSize=0;
static int i=0;
int main()
{
int j=0,result;
char element,str[SIZE];
printf("请输入字符串,以回车结束:\n");
/*以下用循环结构读入字符数组的元素,防止了因字符串中含有空格而不能全部读入的情况*/
scanf("%c",&element);
while(element!='\n')
{
str[j]=element;
elementSize++;//记录了数组中已有元素的个数
j++;
scanf("%c",&element);
}

if(isPalindrome(str))
printf("该字符串是回文字符串\n");
else
printf("该字符串不是回文字符串\n");

// system("pause");
return 0;
}
/*函数功能:判断字符串是否为回文串*/
int isPalindrome(char str[])
{
/*把数组元素前后对应比较,即第一个元素与最后一个元素比较是否相等,依此类推*/
if(i>=elementSize-i-1)//说明是回文串
return 1;

else if(str[i]==str[elementSize-i-1])
{
i++;//i为全局静态变量
isPalindrome(str);
}

else //出现不相等的情况,说明不是回文串,返回0
return 0;
}

③ 怎样生成回文字符串

#include <iostream>
#include <string>
using namespace std;

#define N 80

bool isHuiWen(string str)
{
int i;
for(i=0;i<str.length()-1-i;i++)
if(str[i]!=str[str.length()-1-i])
return 0;
return 1;
}

int getMin(string src,string &dest)
{
if(isHuiWen(src))
{
dest=src;
return 0;
}

char p[N];
int top=0;

string temp=src;
string tempL,tempR;
int m1,m2;

while(temp[0]==temp[temp.length()-1])
{
p[top++]=temp[0];
temp=temp.substr(1,temp.length()-2);
}

m1=getMin(temp[temp.length()-1]+temp,tempL);
m2=getMin(temp+temp[0],tempR);
if(m1<m2) dest=tempL;
else dest=tempR;

while(top>0)
{
top--;
dest=p[top]+dest;
dest+=p[top];
}

return dest.length()-src.length();
}

void main(void)
{
string str,result;
cin>>str;
getMin(str,result);
cout<<result<<endl;
}

④ Delphi程序设计,输入任意字符串,判断其是否为回文字符串,要求用2种算法(利用FOR循环或WHILE循环)

试编写代码如下:

//根据正向、反向相同位置字符对比
functionisHuiWen1(testStr:string):Boolean;
vari,iCount:Integer;
begin
Result:=True;

i:=1;
iCount:=Length(testStr);
while(i<iCount)do
begin
if(testStr[i]<>testStr[iCount])then
begin
Result:=False;
Break;
end;
Inc(i);
Dec(iCount);
end;
end;

//将字符串倒序与原字符对比
//可以直接使用倒序函数,需引入StrUtils
functionisHuiWen2(testStr:string):Boolean;
var
i,iCount:Integer;
str:string;
begin
str:='';
iCount:=Length(testStr);
fori:=iCountdownto1do
str:=str+testStr[i];

Result:=str=testStr;
end;

procereTForm1.btnOneClick(Sender:TObject);
var
i,count,len:Integer;
begin
count:=Length(edtStr.Text);
ifcount<3then
begin
ShowMessage('输入字符数太少!');
Exit;
end;
ifisHuiWen1(edtStr.Text)then
ShowMessage('输入的是回文字符串。')
else
ShowMessage('不是回文字符串。')
end;

procereTForm1.btnTwoClick(Sender:TObject);
var
i,count,len:Integer;
begin
count:=Length(edtStr.Text);
ifcount<3then
begin
ShowMessage('输入字符数太少!');
Exit;
end;
ifisHuiWen2(edtStr.Text)then
ShowMessage('输入的是回文字符串。')
else
ShowMessage('不是回文字符串。')
end;


运行截图如下:


⑤ 测试字符串是否回文,求不同的算法

#include<stdio.h>
int main()
{
int i;
char a[100];
char *p, *q;
for (i = 0; (i<100) && ((a[i] = getchar()) != '\n'); i++);
p = &a[0];
q = &a[i - 1];
while (p<q)
{
if (*p == *q)
{
p++;
q--;
}
else
{
printf("not huiwen!");
break;
}
}
if (p >= q)printf("huiwen!");
getchar();
return 0;
}
用两个指针分别指向这个字符串的头和尾,然后判断指针指向的值如果相等就向中间移动直到头指针达到或超过尾指针(结论是回文),在上面的过程中如果跳出循环就说明头尾的值不相等(结论不是回文)

c语言编程:判定一个字符是否是回文串(回文串是指从开头读和从末尾读均为相同字符的字符串,例如:abcba

1、首先,在C语言软件中,定义多个整型变量,保存程序中所需操作的数值。

⑦ C语言判断回文字符串

//你的错误在于递归调用的时候,i每次都是0,所以要用static int i = 0
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int hui(char a[10000])
{
int n;
static int i=0; //这里改为static int i = 0就对了,因为你递归调用i的时候每次都把i置为0了,那肯定不行的,因为你的i是在变得,所以用static
n=strlen(a);

if(i>=n-i-1)
return 1;
else
{
if (a[i]==a[n-i-1])
{
i++;
hui(a);
}
else
return 0;
}
}
int main(int argc, char *argv[])
{
char a[10000];
gets(a);
if (strlen(a)==0) {printf("No\n");}
else
{
if(hui(a))
printf("Yes\n");
else
printf("No\n");
}
return 0;
}

⑧ c语言求回文子串的个数的高效算法

class Palindrome {
public:
int getLongestPalindrome(string A, int n) {
int max=0,count=0;
for(int i=0;i<n;i++) //i作为回文串的中心
{
for(int j=0;((i-j)>=0)&&((i+j)<n);j++)//若回文串是奇数个,i中心前面有j个,后面有j个
{
if(A[i-j]!=A[i+j])
break;
count=j*2+1;
}
if(max<count)
max=count;
for(int j=0;((i-j)>=0)&&((i+1+j)<n);j++)//若回文串是偶数个,i和i+1是中心,前面有j个,后面有j个
{
if(A[i-j]!=A[i+1+j])
break;
count=j*2+2;
}
if(max<count)
max=count;
}
return max;

}

};

⑨ 回文字符串——递归

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

int main()
{
int i=0,n,k=0;
char a[20],*p,*q;
scanf("%s",a);
n=strlen(a);
p=a; q=p+n-1;
while(i<(n/2+1)&&q>p)
if(*p==*q) { k++;i++; p++; q--; }
if(k==n/2) printf("Yes\n");
else printf("No\n");

system("pause");
return 0;
}
这是对你的简化版。错误之处一一道来:
1,while语句q>p有错误,因为其后的p,q一直未变。
2,while中i<n多余,只需到n/2+1即可。
3,if语句应该是字符比较 *(p+i)==*(q-i)
4,if语句 { k++; i++; } 必须合在一起,不然i是不变的。
5,if语句,p,q没有变。所以while中只是i<n有效
6,最后判断n%2取余没有比较。

⑩ 回文字符串——递归。C语言。

#include<stdio.h>
#include<string.h>
char _str[1005];
int IsH(char _str[],int _L,int _R)
{
if(_L>=_R)return 1;
if(_str[_L]-_str[_R])
return 0;
return IsH(_str,_L+1,_R-1);
}
void main()
{
while(gets(_str),strcmp(_str,"#"))//输入#结束
printf("%s\n",IsH(_str,0,strlen(_str)-1)?"Yes":"No");
}

热点内容
安卓平板和苹果的平板有什么区别 发布:2024-10-09 20:26:37 浏览:425
上传速度对网速的影响吗 发布:2024-10-09 20:09:38 浏览:561
密码锁芯在哪里能买到 发布:2024-10-09 20:05:33 浏览:452
传奇服务器强行下线是什么意思 发布:2024-10-09 20:05:11 浏览:920
sqljoinas 发布:2024-10-09 19:48:01 浏览:391
文本编辑器没有编译器可以吗 发布:2024-10-09 19:39:36 浏览:996
linux环境变量oracle 发布:2024-10-09 19:24:36 浏览:318
pythonimport找不到模块 发布:2024-10-09 19:23:45 浏览:510
安卓怎么卸载插件 发布:2024-10-09 19:07:13 浏览:933
see脚本 发布:2024-10-09 19:07:12 浏览:424