NOI-字符串题目集锦
就觉得挺有意思的,这题,哈希表玩的溜。
#include <iostream> #include <cstring> using namespace std; char s[100001]; int p[30]; int main() { cin>>s; int len=strlen(s); for(int i=0;i<len;i++) p[s[i]-'a']++; for(int i=0;i<len;i++) { if(p[s[i]-'a']==1) { cout<<s[i]<<endl; return 0; } } cout<<"no"<<endl; return 0; }
注意:要用getline获取字符串,因为有可能出现空格的情况。另外,构成完整字符串char数组结尾要加\0。
#include<iostream> #include<cstring> using namespace std; int main() { char s[105]; char ans[105]; cin.getline(s,105); int l = strlen(s); for(int i=0;i<l-1;i++) ans[i]=s[i]+s[i+1]; ans[l-1]=s[0]+s[l-1]; ans[l]=0; cout<<ans<<endl; return 0; }
注意:int a[26]={-1}只会把首元素初始化为-1,其余元素为0。这道题简单题。
#include<iostream> #include<cstring> using namespace std; int main() { char p[105];//加密信息 char m[105];//原信息 char s[105]; char ans[105]; int a[26];//Hash表 memset(a,-1,sizeof(a)); cin>>p>>m>>s; int l1 = strlen(p); for(int i=0;i<l1;i++) { if(a[p[i]-'A']==-1)a[p[i]-'A'] = m[i]-'A'; else { if(a[p[i]-'A']!=m[i]-'A')//加密信息不一致 { cout<<"Failed"<<endl; return 0; } } } for(int i=0;i<26;i++) { if(a[i]==-1)//加密信息不充足 { cout<<"Failed"<<endl; return 0; } } for(int i=0;i<26;i++) { for(int j=0;j<26;j++) { if(a[i]==a[j]&&i!=j)//不同字母对应不同的密字 { cout<<"Failed"<<endl; return 0; } } } int l2 = strlen(s); for(int i=0;i<l2;i++)ans[i] = 'A' + a[s[i]-'A']; ans[l2] = 0;//构成完整字符串 cout<<ans<<endl; return 0; }
strstr()很好用。函数说明。另外字符串长度判定和可能是单字符的情况真的坑。
#include<iostream> #include<cstring> using namespace std; int main() { char s1[35]; char s2[35]; cin>>s1>>s2; int l1 = strlen(s1); int l2 = strlen(s2); if(l2>l1) { char s[35]; strcpy(s,s1); memset(s1,0,sizeof(s1)); strcpy(s1,s2); memset(s2,0,sizeof(s2)); strcpy(s2,s); l1 = strlen(s1); l2 = strlen(s2); } int cnt = l1; if(l1==1&&s1[0]==s2[0]) { cout<<"true"; return 0; } while(cnt--) { char c = s1[0]; for(int i=0;i<l1-1;i++)s1[i]=s1[i+1]; s1[l1-1] = c; if(strstr(s1,s2)) { cout<<"true"; return 0; } } cout<<"false"; return 0; }