字符串反转、包含、全排列、最长回文子串

来源:互联网 发布:子账号在淘宝哪里登陆 编辑:程序博客网 时间:2024/06/16 06:53

问题描述:

 字符串abcdefgh ------> cdefghabc


代码:

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


void backchange(char *str,int from,int to)
{
while(from < to)
{
char t = str[from];
str[from] =   str[to];
str[to] = t;
from++;
to--;
}
}
void strchange(char * str,int m , int n)
{
m = m%n;
backchange(str,0,m-1);
backchange(str,m,n-1);
backchange(str,0,n-1);
}
int main()
{
char str[] = "abcdefghi";
int m;
scanf("%d", &m);
int n = strlen(str);
strchange(str,m,n);
printf("%s\n",str);
}


2.字符串包含

输入:字符串1,字符串2

输出,字符串1是否包含字符串2的所有字符

代码:

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


int partition(char *str, int low, int high)
{
char  tmp = str[low];
char  key = str[low];
while(low<high)
{
while(low<high &&  key <= str[high]) high--;
str[low] = str[high];
while(low<high&& str[low] <= key) low++;
str[high] = str[low];
}
str[low] = tmp;
return low;
}


void Qsort(char * str,int low, int high)
{
if(low<high)
{
int mid = partition(str,low,high);
partition(str,low,mid-1);
partition(str,mid+1,high);
}
}


int ifinclude(char *str1,char* str2)
{
int strlen1 = strlen(str1);
int strlen2 = strlen(str2);
Qsort(str1,0,strlen1);
Qsort(str2,0,strlen2);
printf("%s\n",str1);
printf("%s\n",str2);


int i;
int j=0;
for(i = 0;i<strlen1;i++)
{
if(str1[i] == str2[j] && j< strlen2)
{
j++;
i--;
}
}
if(j == strlen2){return 1;}
}


int main()
{
char str1[256];
char str2[128];
scanf("%s",str1);
scanf("%s",str2);
printf("------------------------------\n");
int result = ifinclude(str1,str2);
if(result == 1)
{
printf("include\n");
}else printf("not include\n");


}

3.字符的全排列

例子:abc

全排列:

abc
abc
acb
bac
bca
cba
cab

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


void swap(char *tmp1,char *tmp2)
{
char tmp = *tmp1;
*tmp1 = *tmp2;
*tmp2 = tmp;
}


void printfullarray(char * str,int from,int to)
{
int i;
if(to <= 1)return ;
if(from == to)
{
printf("%s\n",str);
}else{
for(i = from;i<to;i++)
{
swap(&(str[from]),&(str[i]));
printfullarray(str,from+1,to);
swap(&(str[from]),&(str[i]));
}
}
}
int main()
{
char str[1024];
scanf("%s",str);
int  len = strlen(str);
printfullarray(str,0,len);
}



4 求最长回文子序列(马拉车算法)


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


int changetonewstr(char * str1,char*str2, int len)
{
str2[0] = '$';
int i,j=1;
for(i = 0;i<len;i++)
{
str2[j++] = str1[i];
str2[j++] = '#';
}
return j;
}


int min(int a,int b)
{
return a>b?b:a;
}
void  getmaxstr(char * str, int len, int * p)
{
int mid = 0;
int mx = 0;
int i;
for(i = 0;i<len;i++)
{
if(mx > i)
{
p[i] = min(p[mid*2 - i],mx -i);
}else 
{
p[i] = 1;
}
while(str[i-p[i]] == str[i+p[i]]) p[i]++;


if(mx < p[i]+i)
{
mx = p[i] +i;
mid = i;
}
}

}


void printmax(int * p, char *str, int len)
{
int i;
int tmp = 0;
int max = 0;
for(i = 0 ;i< len;i++)
{
if(p[i]> max)
{
tmp = i;
max = p[i];
}
}

for(i = tmp - max +1;i<tmp + max;i++ )
{
if(str[i] == '#') continue;
else printf("%c",str[i]);
}
printf("\n");
}


int main()
{
char str1[1024];
char str2[1024];
int p[1024];
scanf("%s",str1);
int len = strlen(str1);
len = changetonewstr(str1,str2, len);
printf("str2:%d\n%s\n",len,str2);
getmaxstr(str2,len, p);
printmax(p, str2, len);


}

0 0