给定字符串str ,任务是检查字符串str是否是无限长字符串S的子字符串,在该字符串中小写字母的反向顺序为:
S = “zyxwvutsrqponmlkjihgfedcbazyxwvutsrqponmlkjihgfedcba….”
例子:
Input: str = “cbaz”
Output: YES
Explanation:
Given string “cbaz” is a valid sub string of S.
Input: str = “ywxtuv”
Output: NO
Explanation:
Given string “ywxtuv” is a valid sub string of S.
方法:它可以观察到每一个字符比前一个字符时,后面跟着“Z”“一”,除了较低的ASCII值。解决此问题的最佳方法是简单地检查每个字符,如果其后的字符具有较低的ASCII值。当前字符为“ a”时,忽略此比较。如果出现了当前字符“ a”,请检查其后是否跟有字符“ z”。
步骤如下:
- 创建一个标志变量来标记给定的字符串是否是有效的子字符串。最初将其设置为true。
- 遍历给定的字符串str ,对于每个字符, str [i]执行以下操作:
- 如果str [i + 1] + 1
- 如果str [i] =’a’和str [i + 1] =’z’,则再次继续循环。
- 否则将标志变量标记为false并从循环中中断。
- 如果str [i + 1] + 1
- 最后,如果标志为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
输出:
NO
时间复杂度: O(N)
辅助空间: O(1)