A. Diverse Strings cf 加油

A. Diverse Strings
time limit per test1 second
memory limit per test256 megabytes
inputstandard input
outputstandard output
A string is called diverse if it contains consecutive (adjacent) letters of the Latin alphabet and each letter occurs exactly once. For example, the following strings are diverse: “fced”, “xyz”, “r” and “dabcef”. The following string are not diverse: “az”, “aa”, “bad” and “babc”. Note that the letters ‘a’ and ‘z’ are not adjacent.

Formally, consider positions of all letters in the string in the alphabet. These positions should form contiguous segment, i.e. they should come one by one without any gaps.

You are given a sequence of strings. For each string, if it is diverse, print “Yes”. Otherwise, print “No”.

Input
The first line contains integer n (1≤n≤100), denoting the number of strings to process. The following n lines contains strings, one string per line. Each string contains only lowercase Latin letters, its length is between 1 and 100, inclusive.

Output
Print n lines, one line per a string in the input. The line should contain “Yes” if the corresponding string is diverse and “No” if the corresponding string is not diverse. You can print each letter in any case (upper or lower). For example, “YeS”, “no” and “yES” are all acceptable.

Example
inputCopy
8
fced
xyz
r
dabcef
az
aa
bad
babc
outputCopy
Yes
Yes
Yes
Yes
No
No
No
No
解题思路:这道题就是给你一串字符串,判断其是否符合题意,如果它是连续且不出现重复则符合,输出Yes,否则输出No;
解法一:直接对字符串排序;

#include<iostream>
#include<map>
#include<algorithm>
#include<string.h>
using namespace std;

int n ;
string s ;
int flag1 = 1;
int flag2 = 1;
int a[1000];
int count1 = 0;
map<char,int>mp;            //用于记录是否有重复的字母;
int main()
{
    cin>>n;
    while(n--)
    {         flag1 = 1;       //flag1是用于标记是否有重复的,现在假设没有重复的,置flag=1;
        flag2 = 1;       //flag2是用于记录是否连续;
        cin>>s;
        sort(s.begin(),s.end());     //将字符串排序;
    
        for(int i = 0 ; i < s.size();i++)
        {
            mp[s[i]]++;      //看是否有重复的;先记录下每个字母的个数;
        }
        for(int i = 'A'-'0';i <= 'Z'-'0';i++)
        { 
            if(mp[i]>1)          //字母有重复;
            {
                flag1 = 0;       //将flag1 置为0;
                mp[i] = 0;        
            }

        }
        for(int i = 1 ; i < s.size() ;i++)
        {
            if((s[i]-'0')!=(s[i-1]-'0')+1)      //判断是否连续;如果不连续就是相邻的Ascall码相差不为1;
            {
                flag2 = 0;                 //不连续则将flag2 置为0;
            }
        }
      if(flag1==0||flag2==0)          //如果字母重复或者字母不连续;
      {
          cout<<"No"<<endl;
      }else 
      cout<<"Yes"<<endl;
    }
    return 0;
}

解法二:不利用头文件带的函数,将字符串转为数字再进行数字的排序再存进另一个字符串;这个是刚刚比赛的时候写的,忘记了字符串可以直接排序,所以在思考字符串怎么排序;

就想到可以先转为数字排序再放进另一个字符串;

代码如下:

#include<iostream>
#include<map>
#include<algorithm>
#include<string.h>
using namespace std;

int n ;
string s ;
map<char,int>mp;
int flag1 = 1;
int flag2 = 1;
int a[1000];
int count1 = 0;
string t;
int main()
{
    cin>>n;
    while(n--)
    {
        count1 = 0;
        flag1 = 1;          //用于标记是否重复;
        flag2 = 1;          //用于标记是否连续;
        cin>>s;
        for(int i = 0 ; i < s.size();i++)
        {
            a[i] = s[i]-'0';       //将字符串每位转为数字;
            count1++;              //并计算该数字数组的长度;
        } 
        sort(a,a+count1);            //对数字进行排序;
        t = "";
        for(int i = 0 ; i < count1 ;i++)
        {
            t.push_back(a[i]+'0');          //将数字转为字符放入另一个字符串;
        }
        for(int i = 0 ; i < s.size();i++)
        {
            mp[s[i]]++;                   //记录每个字母出现的个数;
        }
        for(int i = 'A'-'0';i <= 'Z'-'0';i++)
        {
            if(mp[i]>1)              //如果出现重复;
            {
                flag1 = 0;              //将flag1 置为0 ;
                mp[i] = 0;
            }

        }
        for(int i = 1 ; i < t.size() ;i++)
        {
            if((t[i]-'0')!=(t[i-1]-'0')+1)            //如果不连续;就是相邻的Ascall码相差不为1;
            { 
                flag2 = 0;                     //将flag2 置为0;
            }
        }
      if(flag1==0||flag2==0)       //如果有重复或者不连续;
      {
          cout<<"No"<<endl;
      }else 
      cout<<"Yes"<<endl;
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/abc1235454/article/details/88946469