NOI-字符串题目集锦

02:找第一个只出现一次的字符

就觉得挺有意思的,这题,哈希表玩的溜。

#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;
}

05:输出亲朋字符串

注意:要用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;
}

11:潜伏者

注意: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;
}

19:字符串移位包含问题

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;
}

 

posted @ 2019-09-04 11:22  郭怡柔  阅读(310)  评论(0编辑  收藏  举报