给定一个字符串s1和一个字符串s2,写一个片段说明s2是否是s1的旋转? (例如,给定s1=ABCD和s2=CDAB,返回true,给定s1=ABCD,s2=ACBD,返回false)
算法: A旋转(str1、str2)
1. Create a temp string and store concatenation of str1 to str1 in temp. temp = str1.str1 2. If str2 is a substring of temp then str1 and str2 are rotations of each other. Example: str1 = "ABACD" str2 = "CDABA" temp = str1.str1 = "ABACDABACD" Since str2 is a substring of temp, str1 and str2 are rotations of each other.
C++
// C++ program to check if two given strings // are rotations of each other # include <bits/stdc++.h> using namespace std; /* Function checks if passed strings (str1 and str2) are rotations of each other */ bool areRotations(string str1, string str2) { /* Check if sizes of two strings are same */ if (str1.length() != str2.length()) return false ; string temp = str1 + str1; return (temp.find(str2) != string::npos); } /* Driver program to test areRotations */ int main() { string str1 = "AACD" , str2 = "ACDA" ; if (areRotations(str1, str2)) printf ( "Strings are rotations of each other" ); else printf ( "Strings are not rotations of each other" ); return 0; } |
C
// C program to check if two given strings are rotations of // each other # include <stdio.h> # include <string.h> # include <stdlib.h> /* Function checks if passed strings (str1 and str2) are rotations of each other */ int areRotations( char *str1, char *str2) { int size1 = strlen (str1); int size2 = strlen (str2); char *temp; void *ptr; /* Check if sizes of two strings are same */ if (size1 != size2) return 0; /* Create a temp string with value str1.str1 */ temp = ( char *) malloc ( sizeof ( char )*(size1*2 + 1)); temp[0] = '' ; strcat (temp, str1); strcat (temp, str1); /* Now check if str2 is a substring of temp */ ptr = strstr (temp, str2); free (temp); // Free dynamically allocated memory /* strstr returns NULL if the second string is NOT a substring of first string */ if (ptr != NULL) return 1; else return 0; } /* Driver program to test areRotations */ int main() { char *str1 = "AACD" ; char *str2 = "ACDA" ; if (areRotations(str1, str2)) printf ( "Strings are rotations of each other" ); else printf ( "Strings are not rotations of each other" ); getchar (); return 0; } |
JAVA
// Java program to check if two given strings are rotations of // each other class StringRotation { /* Function checks if passed strings (str1 and str2) are rotations of each other */ static boolean areRotations(String str1, String str2) { // There lengths must be same and str2 must be // a substring of str1 concatenated with str1. return (str1.length() == str2.length()) && ((str1 + str1).indexOf(str2) != - 1 ); } // Driver method public static void main (String[] args) { String str1 = "AACD" ; String str2 = "ACDA" ; if (areRotations(str1, str2)) System.out.println( "Strings are rotations of each other" ); else System.out.printf( "Strings are not rotations of each other" ); } } // This code is contributed by munjal |
蟒蛇3
# Python program to check if strings are rotations of # each other or not # Function checks if passed strings (str1 and str2) # are rotations of each other def areRotations(string1, string2): size1 = len (string1) size2 = len (string2) temp = '' # Check if sizes of two strings are same if size1 ! = size2: return 0 # Create a temp string with value str1.str1 temp = string1 + string1 # Now check if str2 is a substring of temp # string.count returns the number of occurrences of # the second string in temp if (temp.count(string2)> 0 ): return 1 else : return 0 # Driver program to test the above function string1 = "AACD" string2 = "ACDA" if areRotations(string1, string2): print ( "Strings are rotations of each other" ) else : print ( "Strings are not rotations of each other" ) # This code is contributed by Bhavya Jain |
C#
// C# program to check if two given strings // are rotations of each other using System; class GFG { /* Function checks if passed strings (str1 and str2) are rotations of each other */ static bool areRotations(String str1, String str2) { // There lengths must be same and // str2 must be a substring of // str1 concatenated with str1. return (str1.Length == str2.Length ) && ((str1 + str1).IndexOf(str2) != -1); } // Driver method public static void Main () { String str1 = "FGABCDE" ; String str2 = "ABCDEFG" ; if (areRotations(str1, str2)) Console.Write( "Strings are" + " rotation s of each other" ); else Console.Write( "Strings are " + "not rotations of each other" ); } } // This code is contributed by nitin mittal. |
PHP
<?php // Php program to check if // two given strings are // rotations of each other /* Function checks if passed strings (str1 and str2) are rotations of each other */ function areRotations( $str1 , $str2 ) { /* Check if sizes of two strings are same */ if ( strlen ( $str1 ) != strlen ( $str2 )) { return false; } $temp = $str1 + $str1 ; if ( $temp . count ( $str2 )> 0) { return true; } else { return false; } } // Driver code $str1 = "AACD" ; $str2 = "ACDA" ; if (areRotations( $str1 , $str2 )) { echo "Strings are rotations " . "of each other" ; } else { echo "Strings are not " . "rotations of each other" ; } // This code is contributed // by Shivi_Aggarwal. ?> |
Javascript
<script> // javascript program to check if two given strings are rotations of // each other /* Function checks if passed strings (str1 and str2) are rotations of each other */ function areRotations( str1, str2) { // There lengths must be same and str2 must be // a substring of str1 concatenated with str1. return (str1.length == str2.length) && ((str1 + str1).indexOf(str2) != -1); } // Driver method var str1 = "AACD" ; var str2 = "ACDA" ; if (areRotations(str1, str2)) document.write( "Strings are rotations of each other" ); else document.write( "Strings are not rotations of each other" ); // This code is contributed by umadevi9616 </script> |
Strings are rotations of each other
方法2(使用STL):
算法:
1.如果两个字符串的大小不相等,则永远不可能。
2.将原始字符串推入队列 q1 .
3.将要检查的字符串推到另一个队列中 问题2 .
4.不断地蹦蹦跳跳 问题2 并将其推回,直到此类操作的数量小于字符串的大小。
5.如果 问题2 等于 q1 在这些操作过程中的任何时候,这都是可能的。否则就不行了。
C++
#include <bits/stdc++.h> using namespace std; bool check_rotation(string s, string goal) { if (s.size() != goal.size()) ; queue< char > q1; for ( int i = 0; i < s.size(); i++) { q1.push(s[i]); } queue< char > q2; for ( int i = 0; i < goal.size(); i++) { q2.push(goal[i]); } int k = goal.size(); while (k--) { char ch = q2.front(); q2.pop(); q2.push(ch); if (q2 == q1) return true ; } return false ; } int main() { string s1 = "ABCD" ; string s2 = "CDAB" ; if (check_rotation(s1, s2)) cout << s2 << " is a rotated form of " << s1 << endl; else cout << s2 << " is not a rotated form of " << s1 << endl; string s3 = "ACBD" ; if (check_rotation(s1, s3)) cout << s3 << " is a rotated form of " << s1 << endl; else cout << s3 << " is not a rotated form of " << s1 << endl; return 0; } |
JAVA
import java.util.*; class GFG{ static boolean check_rotation(String s, String goal) { if (s.length() != goal.length()) ; Queue<Character> q1 = new LinkedList<>(); for ( int i = 0 ; i < s.length(); i++) { q1.add(s.charAt(i)); } Queue<Character> q2 = new LinkedList<>(); for ( int i = 0 ; i < goal.length(); i++) { q2.add(goal.charAt(i)); } int k = goal.length(); while (k> 0 ) { k--; char ch = q2.peek(); q2.remove(); q2.add(ch); if (q2.equals(q1)) return true ; } return false ; } public static void main(String[] args) { String s1 = "ABCD" ; String s2 = "CDAB" ; if (check_rotation(s1, s2)) System.out.print(s2+ " is a rotated form of " + s1 + "" ); else System.out.print(s2+ " is not a rotated form of " + s1 + "" ); String s3 = "ACBD" ; if (check_rotation(s1, s3)) System.out.print(s3+ " is a rotated form of " + s1 + "" ); else System.out.print(s3+ " is not a rotated form of " + s1 + "" ); } } // This code is contributed by gauravrajput1 |
蟒蛇3
def check_rotation(s, goal): if ( len (s) ! = len (goal)): skip q1 = [] for i in range ( len (s)): q1.insert( 0 , s[i]) q2 = [] for i in range ( len (goal)): q2.insert( 0 , goal[i]) k = len (goal) while (k > 0 ): ch = q2[ 0 ] q2.pop( 0 ) q2.append(ch) if (q2 = = q1): return True k - = 1 return False if __name__ = = "__main__" : s1 = "ABCD" s2 = "CDAB" if (check_rotation(s1, s2)): print (s2, " is a rotated form of " , s1) else : print (s2, " is not a rotated form of " , s1) s3 = "ACBD" if (check_rotation(s1, s3)): print (s3, " is a rotated form of " , s1) else : print (s3, " is not a rotated form of " , s1) # This code is contributed by ukasp. |
CDAB is a rotated form of ABCDACBD is not a rotated form of ABCD
使用的库函数: strstr: strstr在字符串中查找子字符串。 原型:char*strstrstr(const char*s1,const char*s2); 看见 http://www.lix.polytechnique.fr/Labo/Leo.Liberti/public/computing/prog/c/C/MAN/strstr.htm 更多细节 strcat: strncat连接两个字符串 原型:char*strcat(char*dest,const char*src); 看见 http://www.lix.polytechnique.fr/Labo/Leo.Liberti/public/computing/prog/c/C/MAN/strcat.htm 更多细节
时间复杂性: 这个问题的时间复杂度取决于strstr函数的实现。 如果strstr的实现是使用KMP matcher完成的,那么上述程序的复杂性为(-)(n1+n2),其中n1和n2是字符串的长度。KMP matcher需要(-)(n)时间在长度为n的字符串中找到一个子字符串,其中子字符串的长度被假定为小于该字符串。
方法3:
算法:
1.找到要检查的字符串中原始字符串第一个字符的所有位置。
2、对于所找到的每个位置,将其视为要检查的字符串的起始索引。
3.从新的起始索引开始,比较两个字符串并检查它们是否相等。
(假设原始字符串为 s1 ,要检查的字符串 s2,n 是字符串的长度和 J 是s1的第一个字符在s2中的位置,
然后,对于i
4.对找到的所有位置重复第3步。
C++
#include <iostream> #include <vector> using namespace std; bool checkString(string &s1, string &s2, int indexFound, int Size) { for ( int i=0;i<Size;i++){ //check whether the character is equal or not if (s1[i]!=s2[(indexFound+i)%Size]) return false ; // %Size keeps (indexFound+i) in bounds, since it ensures it's value is always less than Size } return true ; } int main() { string s1= "abcd" ; string s2= "cdab" ; if (s1.length()!=s2.length()){ cout<< "s2 is not a rotation on s1" <<endl; } else { vector< int > indexes; //store occurences of the first character of s1 int Size = s1.length(); char firstChar = s1[0]; for ( int i=0;i<Size;i++) { if (s2[i]==firstChar) { indexes.push_back(i); } } bool isRotation= false ; // check if the strings are rotation of each other for every occurence of firstChar in s2 for ( int idx: indexes) { isRotation = checkString( s1, s2, idx, Size); if (isRotation) break ; } if (isRotation)cout<< "s2 is rotation of s1" <<endl; else cout<< "s2 is not a rotation of s1" <<endl; } return 0; } |
s2 is rotation of s1
时间复杂性:
在最坏的情况下,时间复杂度将是n*n,其中n是字符串的长度。