📌  相关文章
📜  检查一个字符串可以通过最多 X 次顺时针循环从另一个字符串形成

📅  最后修改于: 2021-09-07 03:02:44             🧑  作者: Mango

给定一个整数X和两个字符串S1S2 ,任务是检查字符串S1 是否可以通过顺时针旋转字符最多 X 次来转换为字符串S2

方法:思路是遍历字符串和对于每个索引,找出两个字符串各自索引处字符的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