Codeforces Round #731 (Div. 3) B. Alphabetical Strings

B. Alphabetical Strings

题意

你一开始有一个空的字符串 s = "" 
从‘a'到‘z'这26个字母按照顺序
你每次可以 s = s + 这个字母
或者是 s = 这个字母 + s 
现在给你q个询问
(q <= 1e4)
每个询问给你一个字符串
(strlen <= 26)
问这个字符串是否可以是s的其中一个子串

思路

s必定是从字母a开始相加
所以先找到字母a的下标
然后定义2个指针l,r
依次向左和向右走
如果这2个指针可以走到头
说明是s的子串

时间复杂度:O n

#include<bits/stdc++.h>
#define fer(i,a,b) for(re i = a ; i <= b ; ++ i)
#define re register int
#define pll pair<int,int> 
#define x first 
#define y second 
#define sf(x) scanf("%d",&x)
#define sfl(x) scanf("%lld",&x)
typedef long long ll ;
using namespace std;
const int N =  1e6 + 10 , M = 1010 , inf = 0x3f3f3f3f , mod = 1e9 + 7 ;
char a[N] ;
int main()
{
    int t ;
    cin >> t ;
    
    while(t--)
    {
        cin >> a + 1 ;
        int n = strlen(a + 1) ;
        
        a[n + 1] = '.' ;  // 让a[n+1]等于一个不存在的字符
        // 所以最后不会对r这个指针产生影响
        
        int xia = 0 ;
        
        fer(i,1,n)
        {
            if(a[i] == 'a') 
            {
                xia = i ;
                break ;
            }
        }
        
        if(!xia) puts("NO");
        else
        {
            int l = xia - 1 , r = xia + 1 ;
            
            char k = 'b' ;
            
            while(true)
            {
                if(a[l] == k) 
                {
                    l -- ;
                    k ++ ;
                }
                else if(a[r] == k)
                {
                    r ++ ;
                    k ++ ;
                }
                else break ;
            }
            
            if(l == 0 && r == n + 1) puts("YES");
            else puts("NO") ;
        }
    }
    return 0;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值