📌  相关文章
📜  检查给定的字符串是否是由 z 与 a 重复连接形成的字符串的子字符串

📅  最后修改于: 2021-09-07 04:41:30             🧑  作者: Mango

给定一个字符串str ,任务是检查字符串str是否是无限长度字符串S的子字符串,其中小写字母以相反的顺序连接为:

例子:

方法:可以观察到,除了‘a’后跟‘z’时,每个下一个字符的 ASCII 值都低于前一个字符。解决这个问题的最好办法是简单地检查每一个字符,如果字符以下它具有较低的ASCII值。当前字符为 ‘a’ 时忽略此比较。如果当前字符’a’ 出现,则检查它后面是否有字符是 ‘z’。

以下是步骤:

  1. 创建一个标志变量来标记给定的字符串是否是有效的子字符串。最初将其设置为 true。
  2. 遍历给定的字符串str ,对于每个字符, str[i]执行以下操作:
    • 如果 str[i+1] + 1 < str[i],则继续循环。
    • 如果 str[i] = ‘a’ 且 str[i+1] = ‘z’,则再次继续循环。
    • 否则将标志变量标记为 false 并中断循环。
  3. 最后,如果标志为 true 则打印YES否则打印NO

下面是上述方法的实现:

C++
// C++ program for the above approach
#include 
using namespace std;
 
// Function checks if a given string is
// valid or not and prints the output
void checkInfinite(string s)
{
    // Boolean flag variable to mark
    // if given string is valid
    bool flag = 1;
 
    int N = s.length();
 
    // Traverse the given string
    for (int i = 0; i < N - 1; i++) {
 
        // If adjacent character
        // differ by 1
        if (s[i] == char(int(s[i + 1]) + 1)) {
            continue;
        }
 
        // If character 'a' is
        // followed by 4
        else if (s[i] == 'a'
                 && s[i + 1] == 'z') {
            continue;
        }
 
        // Else flip the flag and
        // break from the loop
        else {
            flag = 0;
            break;
        }
    }
 
    // Output according to flag variable
    if (flag == 0)
        cout << "NO";
    else
        cout << "YES";
}
 
// Driver Code
int main()
{
    // Given string
    string s = "ecbaz";
 
    // Function Call
    checkInfinite(s);
 
    return 0;
}


Java
// Java program for the above approach
class GFG{
 
// Function checks if a given string is
// valid or not and prints the output
public static void checkInfinite(String s)
{
     
    // Boolean flag variable to mark
    // if given string is valid
    boolean flag = true;
 
    int N = s.length();
 
    // Traverse the given string
    for(int i = 0; i < N - 1; i++)
    {
         
        // If adjacent character
        // differ by 1
        if (s.charAt(i) == (char)((int)
           (s.charAt(i + 1)) + 1))
        {
            continue;
        }
 
        // If character 'a' is
        // followed by 4
        else if (s.charAt(i) == 'a' &&
                 s.charAt(i + 1) == 'z')
        {
            continue;
        }
 
        // Else flip the flag and
        // break from the loop
        else
        {
            flag = false;
            break;
        }
    }
 
    // Output according to flag variable
    if (!flag)
        System.out.print("NO");
    else
        System.out.print("YES");
}
 
// Driver code
public static void main(String[] args)
{
     
    // Given string
    String s = "ecbaz";
 
    // Function call
    checkInfinite(s);
}
}
 
// This code is contributed by divyeshrabadiya07


Python3
# Python3 program for the above approach
 
# Function checks if a given is
# valid or not and prints the output
def checkInfinite(s):
 
    # Boolean flag variable to mark
    # if given is valid
    flag = 1
 
    N = len(s)
 
    # Traverse the given string
    for i in range(N - 1):
 
        # If adjacent character
        # differ by 1
        if (s[i] == chr(ord(s[i + 1]) + 1)):
            continue
 
        # If character 'a' is
        # followed by 4
        elif (s[i] == 'a' and s[i + 1] == 'z'):
            continue
 
        # Else flip the flag and
        # break from the loop
        else:
            flag = 0
            break
 
    # Output according to flag variable
    if (flag == 0):
        print("NO")
    else:
        print("YES")
 
# Driver Code
if __name__ == '__main__':
 
    # Given string
    s = "ecbaz"
 
    # Function Call
    checkInfinite(s)
 
# This code is contributed by mohit kumar 29


C#
// C# program for the above approach
using System;
 
class GFG{
 
// Function checks if a given string is
// valid or not and prints the output
public static void checkInfinite(String s)
{
     
    // Boolean flag variable to mark
    // if given string is valid
    bool flag = true;
 
    int N = s.Length;
 
    // Traverse the given string
    for(int i = 0; i < N - 1; i++)
    {
         
        // If adjacent character
        // differ by 1
        if (s[i] == (char)((int)
           (s[i + 1]) + 1))
        {
            continue;
        }
 
        // If character 'a' is
        // followed by 4
        else if (s[i] == 'a' &&
                 s[i + 1] == 'z')
        {
            continue;
        }
 
        // Else flip the flag and
        // break from the loop
        else
        {
            flag = false;
            break;
        }
    }
 
    // Output according to flag variable
    if (!flag)
        Console.Write("NO");
    else
        Console.Write("YES");
}
 
// Driver code
public static void Main(String[] args)
{
     
    // Given string
    String s = "ecbaz";
 
    // Function call
    checkInfinite(s);
}
}
 
// This code is contributed by Rajput-Ji


Javascript


输出:
NO

时间复杂度: O(N)
辅助空间: O(1)

如果您想与行业专家一起参加直播课程,请参阅Geeks Classes Live