给定一个字符串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.
方法:可以观察到,除了‘a’后跟‘z’时,每个下一个字符的 ASCII 值都低于前一个字符。解决这个问题的最好办法是简单地检查每一个字符,如果字符以下它具有较低的ASCII值。当前字符为 ‘a’ 时忽略此比较。如果当前字符’a’ 出现,则检查它后面是否有字符是 ‘z’。
以下是步骤:
- 创建一个标志变量来标记给定的字符串是否是有效的子字符串。最初将其设置为 true。
- 遍历给定的字符串str ,对于每个字符, str[i]执行以下操作:
- 如果 str[i+1] + 1 < str[i],则继续循环。
- 如果 str[i] = ‘a’ 且 str[i+1] = ‘z’,则再次继续循环。
- 否则将标志变量标记为 false 并中断循环。
- 最后,如果标志为 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)