Alphabetical Strings (Codeforces 1547B)
Tags: Greedy, strings

A string $$$s$$$ of length $$$n$$$ ($$$1 \le n \le 26$$$) is called alphabetical if it can be obtained using the following algorithm:  first, write an empty string to $$$s$$$ (i.e. perform the assignment $$$s$$$ := "");  then perform the next step $$$n$$$ times;  at the $$$i$$$-th step take $$$i$$$-th lowercase letter of the Latin alphabet and write it either to the left of the string $$$s$$$ or to the right of the string $$$s$$$ (i.e. perform the assignment $$$s$$$ := $$$c+s$$$ or $$$s$$$ := $$$s+c$$$, where $$$c$$$ is the $$$i$$$-th letter of the Latin alphabet). In other words, iterate over the $$$n$$$ first letters of the Latin alphabet starting from 'a' and etc. Each time we prepend a letter to the left of the string $$$s$$$ or append a letter to the right of the string $$$s$$$. Strings that can be obtained in that way are alphabetical.For example, the following strings are alphabetical: "a", "ba", "ab", "bac" and "ihfcbadeg". The following strings are not alphabetical: "z", "aa", "ca", "acb", "xyz" and "ddcba".From the given string, determine if it is alphabetical.

Input: The first line contains one integer $$$t$$$ ($$$1 \le t \le 10^4$$$) — the number of test cases. Then $$$t$$$ test cases follow.Each test case is written on a separate line that contains one string $$$s$$$. String $$$s$$$ consists of lowercase letters of the Latin alphabet and has a length between $$$1$$$ and $$$26$$$, inclusive.

Output: Output $$$t$$$ lines, each of them must contain the answer to the corresponding test case. Output YES if the given string $$$s$$$ is alphabetical and NO otherwise.You can output YES and NO in any case (for example, strings yEs, yes, Yes and YES will be recognized as a positive answer).

Note: The example contains test cases from the main part of the condition.

Sample Inputs:
11
a
ba
ab
bac
ihfcbadeg
z
aa
ca
acb
xyz
ddcba

Sample Outputs:
YES
YES
YES
YES
YES
NO
NO
NO
NO
NO
NO

Solution (Python):
class Solution:

    def __init__(self):
        pass

    def solve(self):
        t = int(input())
        result = []
        for i in range(t):
            s = list(input())
            n = len(s)
            flag = True
            prev = max(ord(s[0]), ord(s[-1])) + 1
            for j in range(n):
                if ord(s[0]) == prev - 1:
                    s.pop(0)
                    prev -= 1
                elif ord(s[-1]) == prev - 1:
                    s.pop(-1)
                    prev -= 1
                else:
                    flag = False
                    break
            if prev == 97 and flag:
                result.append('YES')
            else:
                result.append('NO')
        for x in result:
            print(x)
if __name__ == '__main__':
    sol = Solution()
    sol.solve()

Solution (Python):
def test(s):
    l = len(s)
    if s.count('a') == 1:
        s = '1' + s + '1'
        i = s.index('a')
        u = ord('b')
        left = 1
        right = 1
        for x in range(l - 1):
            if chr(u) == s[i + right]:
                right += 1
            elif chr(u) == s[i - left]:
                left += 1
            else:
                return 'NO'
            u += 1
        return 'YES'
    else:
        return 'NO'
n = int(input())
for _ in range(n):
    s = test(input())
    print(s)

Solution (Python):
for s in [*open(0)][1:]:
    i = 0
    j = len(s)
    while (j := (j - 1)) and (c := chr(96 + j)) in (s[i], s[i + j - 1]):
        i += c == s[i]
    print('YNEOS'[j > 0::2])