题目:字符串s中包含若干个回文字符子串,找出其中所有长度大于2的回文字符,然后按其长度的降序存 放在字符串数组str中,若某个回文字符串已经存在str中,则丢弃。
例如:字符串s为:“ILoLoL.jiangsu151uhj”:
其中,回文子串有:“LoLoL”,“LoL”,“oLo”,“LoL”,“u151u”,“151”
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------------
编写程序:
1.编写函数int GenStr(int start,char s[ ] ,char str[ ] [ N ] ),从串s的str下标至最后一个字符之间查找回文字符串,若找到则保存到字符串数组str中,函数返回找到的回文字符串的个数。
2.编写函数void InsertStr(char str[ ][N],char step [ ][N],int n),将s的n个字符串按其长度的降序插入到字符串str中,如果插入的字符串已存在,则不插入。
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <math.h> #include <ctype.h>, #define N 255 #define M 100 int GenStr(int start,char s[ ] ,char str[ ] [ N ] ) {
int i,j,k,m; static p=0; j=strlen(s)-1; i=start; while(j-i>1) {
while(i<j) if(s[i]!=s[j])j--; else break; } if(i!=j) {
k=1;m=j; while(i<=j) if(s[i]==s[j]) {
k=0;break; } else {
i++;j--; } if(k) {
j=0; for(i=start;i<=m;i++) str[p][j++]=s[i]; str[p++][j]=0; j=m;i=start;j--; } } } return p; } void InsertStr(char str[ ]IN], char step[ ]IN], int n) {
int i,j,k,m=0,c; for(i=0;i<n;i++) {
k=1; for(j=0;j<m;j++) if(strcmp(step[i],str[j])==0) {
k=0;break; } if(k) {
c=m-1; while(c>=0&&strlen(step[i])>strlen(str[c])) {
strcpy(str[c+1], str[c]); } } c--; strcpy(str[c+1], step[i]); m++; } } } int main( ) {
FILE *fp; int i, n; char s[N]="ILoLoL.jiangsu151uhj"; fp=fopen("DATA.dat" ,"w"); if( fp==NULL) {
printf("Write File Error"); exit(0); } for (i=0; i<strlen(s)-2; i++) {
n=GenStr(i,s, step); InsertStr(str,step,n); } printf("长度大于2的回文字符串有: \n"); for(i=0; str[i][0]; i++) {
puts(str[i]); fputs(str[i],fp); } fclose(fp); return 0; }
讯享网

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/11020.html