类型一:两串字符寻找相同或不同的字符/字符串
如下为判断ch是否为sh的子序列
#include<stdio.h>
#include<string.h>
//双指针解决
int main(){
char sh[1000]={},ch[1000]={};
scanf("%s %s",&sh,&ch);
int i=0,j,ret=1;
for(j=0;j<strlen(sh);j++){
ret=1;
if(ch[i]==sh[j]){
int k=1;
while(k+i<strlen(ch)){
if(ch[k+i]==sh[k+j]){
k++;
continue;
}
else break;
}
if(k+i==strlen(ch)){
printf("1\n");
ret=0;
break;
}
}
}
if(ret) printf("-1\n");
}
还能用strcmp判断
#include<stdio.h>
#include<string.h>
int main(){
char sh[100]={},ch[100]={},shf[100]={};
scanf("%s %s",&sh,&ch);
int i=0,j,ret=1;
for(j=0;j<strlen(sh);j++){
if(sh[j]==ch[i]){
int k;
for(k=0;k<strlen(ch);k++){
shf[k]=sh[j+k];//将后面对应于ch长度的字符串存储
}
}
if(strcmp(shf,ch)==0){
ret=0;
printf("1\n");
break;
}
}
if(ret) printf("-1\n");
}
类型二:删去特定的字符或字符串
如剑指 Offer II 016. 不含重复字符的最长子字符串
边判断边删,利用双指针
#include<stdio.h>
#include<string.h>
//双指针,一个用于存储,一个用于搜查
int main(){
char sh[100]={};
scanf("%s",&sh);
int i=0,j,k=0;
for(i=1;i<strlen(sh);i++){
int ret=1;
for(j=0;j<=k;j++){
if(sh[j]==sh[i]){
ret=0;
continue;
}
}
if(ret) sh[++k]=sh[i];
}
sh[++k]='\0';
printf("%s\n%d",sh,k);
}
leetcode有哈希表和动态规划解法,我还不会。。。
如果是删除有序字符串
那就得先判断它的具体位置,可能有多段,写个函数单独处理,存储时直接跳过那个片段。
#include<stdio.h>
#include<string.h>
//双指针解决
int sch(char* sh,char *ch){
int i=0,j,ret=1;
for(j=0;j<strlen(sh);j++){
ret=1;
if(ch[i]==sh[j]){
int k=1;
while(k+i<strlen(ch)){
if(ch[k+i]==sh[k+j]){
k++;
continue;
}
else break;
}
if(k+i==strlen(ch)){
ret=0;
return j;
}
}
}
return -1;
}
int main(){
char sh[1000]={},ch[1000]={};
scanf("%s %s",&sh,&ch);
int t=sch(sh,ch);
while(t>=0){
int i;
for(i=t;i<strlen(sh) && i+strlen(ch)<strlen(sh);i++){
*(sh+i)=*(sh+i+strlen(ch));
}
*(sh+i)='\0';
t=sch(sh,ch);
}
printf("%s",sh);
}
类型三:插入特定的字符/字符串
#include<stdio.h>
#include<string.h>
int main(){
char sh[100]={},ch[100]={};
int t,i,j;
scanf("%s %s %d",&sh,&ch,&t);
for(i=0;i<strlen(ch);i++){
char k=*(sh+t+i);
*(sh+t+i)=*(ch+i);
sh[t+i+1]=k;
}
printf("%s",sh);
}
类型四:将字符串转化为数字进行运算
大整数加法
大整数乘法
我累了,以后再写