给定一个整数X和两个字符串S1和S2 ,任务是检查字符串S1 是否可以通过顺时针旋转字符最多 X 次来转换为字符串S2 。
Input: S1 = “abcd”, S2 = “dddd”, X = 3
Output: Yes
Explanation:
Given string S1 can be converted to string S2 as-
Character “a” – Shift 3 times – “d”
Character “b” – Shift 2 times – “d”
Character “c” – Shift 1 times – “d”
Character “d” – Shift 0 times – “d”
Input: S1 = “you”, S2 = “ara”, X = 6
Output: Yes
Explanation:
Given string S1 can be converted to string S2 as –
Character “y” – Circular Shift 2 times – “a”
Character “o” – Shift 3 times – “r”
Character “u” – Circular Shift 6 times – “a”
方法:思路是遍历字符串和对于每个索引,找出两个字符串各自索引处字符的ASCII值之间的差异。如果差值小于 0,则对于循环移位,添加 26 以获得实际差值。如果对于任何索引,差异超过X ,则S2不能从S1形成,否则可能。
下面是上述方法的实现:
C++
// C++ implementation to check
// that a given string can be
// converted to another string
// by circular clockwise shift
// of each character by atmost
// X times
#include
using namespace std;
// Function to check that all
// characters of s1 can be
// converted to s2 by circular
// clockwise shift atmost X times
void isConversionPossible(string s1,
string s2, int x)
{
int diff, n;
n = s1.length();
// Check for all characters of
// the strings whether the
// difference between their
// ascii values is less than
// X or not
for (int i = 0; i < n; i++) {
// If both the characters
// are same
if (s1[i] == s2[i])
continue;
// Calculate the difference
// between the ASCII values
// of the characters
diff = (int(s2[i] - s1[i])
+ 26)
% 26;
// If difference exceeds X
if (diff > x) {
cout << "NO" << endl;
return;
}
}
cout << "YES" << endl;
}
// Driver Code
int main()
{
string s1 = "you";
string s2 = "ara";
int x = 6;
// Function call
isConversionPossible(s1, s2, x);
return 0;
}
Java
// Java implementation to check
// that a given string can be
// converted to another string
// by circular clockwise shift
// of each character by atmost
// X times
import java.io.*;
import java.util.*;
class GFG{
// Function to check that all
// characters of s1 can be
// converted to s2 by circular
// clockwise shift atmost X times
static void isConversionPossible(String s1,
String s2,
int x)
{
int diff = 0, n;
n = s1.length();
// Check for all characters of
// the strings whether the
// difference between their
// ascii values is less than
// X or not
for(int i = 0; i < n; i++)
{
// If both the characters
// are same
if (s1.charAt(i) == s2.charAt(i))
continue;
// Calculate the difference
// between the ASCII values
// of the characters
diff = ((int)(s2.charAt(i) -
s1.charAt(i)) + 26) % 26;
// If difference exceeds X
if (diff > x)
{
System.out.println("NO");
return;
}
}
System.out.println("YES");
}
// Driver Code
public static void main (String[] args)
{
String s1 = "you";
String s2 = "ara";
int x = 6;
// Function call
isConversionPossible(s1, s2, x);
}
}
// This code is contributed by Ganeshchowdharysadanala
Python3
# Python3 implementation to check
# that the given string can be
# converted to another string
# by circular clockwise shift
# Function to check that the
# string s1 can be converted
# to s2 by clockwise circular
# shift of all characters of
# str1 atmost X times
def isConversionPossible(s1, s2, x):
n = len(s1)
s1 = list(s1)
s2 = list(s2)
for i in range(n):
# Difference between the
# ASCII numbers of characters
diff = ord(s2[i]) - ord(s1[i])
# If both characters
# are the same
if diff == 0:
continue
# Condition to check if the
# difference less than 0 then
# find the circular shift by
# adding 26 to it
if diff < 0:
diff = diff + 26
# If difference between
# their ASCII values
# exceeds X
if diff > x:
return False
return True
# Driver Code
if __name__ == "__main__":
s1 = "you"
s2 = "ara"
x = 6
# Function Call
result = isConversionPossible(s1, s2, x)
if result:
print("YES")
else:
print("NO")
C#
// C# implementation to check
// that a given string can be
// converted to another string
// by circular clockwise shift
// of each character by atmost
// X times
using System;
class GFG{
// Function to check that all
// characters of s1 can be
// converted to s2 by circular
// clockwise shift atmost X times
static void isConversionPossible(String s1,
String s2,
int x)
{
int diff = 0, n;
n = s1.Length;
// Check for all characters of
// the strings whether the
// difference between their
// ascii values is less than
// X or not
for(int i = 0; i < n; i++)
{
// If both the characters
// are same
if (s1[i] == s2[i])
continue;
// Calculate the difference
// between the ASCII values
// of the characters
diff = ((int)(s2[i] -
s1[i]) + 26) % 26;
// If difference exceeds X
if (diff > x)
{
Console.Write("NO");
return;
}
}
Console.Write("YES");
}
// Driver Code
public static void Main ()
{
String s1 = "you";
String s2 = "ara";
int x = 6;
// Function call
isConversionPossible(s1, s2, x);
}
}
// This code is contributed by chitranayal
Javascript
YES
时间复杂度: O(N),N=Length(S1)
辅助空间: O(1)
如果您想与行业专家一起参加直播课程,请参阅Geeks Classes Live