首页 > 试题广场 >

字符串ABCD,可以由字符串BCDA或者CDAB通过循环移位

[问答题]
字符串ABCD,可以由字符串BCDA或者CDAB通过循环移位而得到。请编程实现以下检测:字符串S1是否可以由字符串S2通 过循环移位而得到。 语言不限(推荐C/C++,不推荐写伪码)
bool cmpstr(string s1,string s2)
{
if (s1.size()!=s2.size()) 
return false;
string s3;
s3=s1+s1;
if(s3.find_first_of(s2,0)!=string::npos)
return true;
else 
return false;
}

void main(void) 
{  
  string str1="ABCDEFG",str2="CDEFGAB";
  if(cmpstr(str1,str2))
 cout<<"匹配成功"<<endl;
  else
 cout<<"匹配失败"<<endl;
  
}

发表于 2015-08-22 23:20:44 回复(1)
将ABCD拆分为XY,旋转之后的即为YX,由于YX是XYXY的子串,所以要想判断是否能通过旋转得到,那么只需要判断,目的串是否是两个原串的子串,若是则可以,否则不可以。
发表于 2015-08-20 10:27:06 回复(0)
java 最简单
建立一个stringbuffer 以s2为基础  然后append一个s2
然后判断tostring 判断 contains s1即可

编辑于 2016-09-08 16:12:32 回复(0)
将ABCD拆分为XY,旋转之后的即为YX,由于YX是XYXY的子串,所以要想判断是否能通过旋转得到,那么只需要判断,目的串是否是两个原串的子串,若是则可以,否则不可以。
public boolean isRote(String str1,String str2){
if(str1==null && str2==null)
return true;
if(str1==null || str2==null)
return false;
if(str1.equals(str2)) return true;
for(int i = 0;i<str2.length()-1;i++){
String sub1 = str2.substring(0, i+1);
String sub2 = str2.substring(i+1, str2.length());
if(str1.contains(sub1)&&str2.contains(sub2))
return true;
}
return false;
}
发表于 2015-09-14 10:46:27 回复(0)
public class IsACouldRevertToB { public static boolean didACouldRevertToB(char[] A,char[] B){ if(B==null || B.length != A.length) return false; boolean re = true; int hash = 0; for(int i = 0; i < A.length; i++) { hash |= (1<<(A[i]-'A')); } for(int i = 0; i < B.length; i++) { hash &= (1<<(B[i]-'A')); if(hash==0){ re = false; break; } } // System.out.println(hash); return re; } public static void main(String[] args) { // TODO Auto-generated method stub String A = "ABCD"; String B = "defe"; didACouldRevertToB(A.toCharArray(),B.toCharArray()); } }
发表于 2014-10-12 20:03:37 回复(4)
def areAnagram(s1,s2):    

        if(len(s1)!=len(s2)):

            return False

        else:

            for _ in range(len(s1)):

                temp=s1[1:]

                temp+=s1[0]

                if temp==s2:

                    return True

            return False

if __name__ == "__main__":

    s1=input("Enter first string: ")

    s2=input("Enter second string: ")

    if areAnagram(s1,s2):

        print("Strings are anagram of each other")

    else:

        print("Strings are not anagram of each other")

发表于 2025-09-02 15:47:25 回复(0)
package 字符串循环位移;

public class StrMoveAround {
    public static void main(String[] args) {
        StrMoveAround strMoveAround = new StrMoveAround();
        System.out.println(strMoveAround.fun1("ABCD", "CDAB"));

        System.out.println(strMoveAround.fun2("ABCDEFG", "BCDEFGA"));
    }

    public boolean fun1(String s1, String s2) {
        int length = s2.length();
        for (int i = 0; i < length; i++) {
            char[] chars = s2.toCharArray();
            char temp = chars[0];
            for (int j = 0; j < length - 1; j++) {
                chars[j] = chars[j + 1];
            }
            chars[length - 1] = temp;
            String s = String.valueOf(chars);        //输出一次循环位移的结果
            System.out.println(s);
            if (s1.equals(s))
                return true;
            s2 = s;
        }
        return false;
    }

    public boolean fun2(String s1, String s2) {
        return (s2 + s2).indexOf(s1) < s2.length() && s2.length() == s1.length() ? true : false;
    }
}

发表于 2021-03-13 12:01:26 回复(0)
class Solution{
    public static boolean isTrue(String s1, String s2){
        int len = s1.length();
        int len2 = s2.length();
        if(len!=len2){
            return false;
        }
        LinkedList<Character> list = new LinkedList<>(); 
        for(int i=0;i<len;i++){
            list.add(s2.charAt(i));
        }
        for(int i=0;i<len;i++){
            list.insert(0,list.get(len-1));
            StringBuilder s=new StringBuilder();
            for(int j=0;j<len;){
                s.append(list.get(j));
                                j++;
            }
            if(s.toString().equals(s1)){
                return true;
            }
        }
        return false;
    }
}

发表于 2020-07-18 10:44:25 回复(0)
import java.util.Scanner;

/**
 * 字符串ABCD,可以由字符串BCDA或者CDAB通过循环移位而得到。
 * 请编程实现以下检测:字符串S1是否可以由字符串S2通 过循环移位而得到 -- 美团
 *
 * @author Jian Shen
 * @version V1.0
 * @date 2018/11/27
 */
public class CyclicShift {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNext()) {
            String s1 = scanner.next();
            String s2 = scanner.next();
            System.out.println(isContained(s1, s2));
        }
    }

    private static boolean isContained(String s1, String s2) {
        if (s1 == null || s2 == null) {
            return false;
        }
        StringBuilder builder = new StringBuilder();
        builder.append(s2).append(s2);

        if (builder.toString().contains(s1)) {
            return true;
        }
        return false;
    }
}
发表于 2018-11-27 14:15:16 回复(2)
思路:先将字符串A的所有的左旋转字符串放到一个集合里面,然后判断B是否在A里面,若是有则证明B是A的旋转字符串
步骤:1,求一个字符串的左旋转字符串 2.做比较
代码:
bool IsRotate(char* strA, const int& lenA, char* strB)
{
	bool isContain = false;
	if (strA==NULL || strB==NULL)
	{
		return isContain;
	}

	//每次步长为1,循环lenA次
	for (int i=0; i<lenA; i++)
	{
		//Rotate利用三步反转法完成字符串的反转,即YX= (X^T*Y^T)^T
		Rotate(strA, lenA, 1);
		if (strcmp(strA, strB))//比较strB是否和strA相等,若是相等,则不用再比较了
		{
			isContain = true;
			break;			
		}
		
	}
	return isContain;
}

void Rotate(char* s, int length, int selctNum)
{
	Invert(s, s + (selctNum-1));
	Invert(s+selctNum, s+(length-1));
	Invert(s, s+(length-1));
}

void Invert(char* start, char* end)
{
	if (start == NULL || end == NULL)
	{
		return;
	}

	
	while (start < end)
	{
		char temp = *start;
		*start = *end;
		*end = temp;

		start++;
		end--;
	}
} 

发表于 2015-09-11 20:40:57 回复(0)
bool cmpstr(const char* s1,const char* s2)
{
	if(!s1||!s2)
		return false;
	int len1=strlen(s1);
	int len2=strlen(s2);
	if(len1!=len2)
		return false;
	if(len1==0)
		return true;
	char *s3=(char *)malloc(2*len1+1);
	memset(s3,0,2*len1+1);
	strcat(s3,s2);
	strcat(s3,s2);
	for(int i=0;i<len1;i++)
		if(strncmp(s1,s3+i,len1)==0)
			return true;
	return false;
}

发表于 2015-09-11 20:13:02 回复(0)
#include"iostream"
using namespace std;

bool cmp(const char* p1,const char *p2,int len){
if((!p1&&!p2)||(len==0))//注意长度为“0的时候匹配成功”
return true;
if(!p1||!p2||len<0)
return false;

int i=0;
while(i<len&&*(p1+i)==*(p2+i))
i++;
if(i==len)
return true;
else 
return false;
}  
bool decision(const char* p1,const char* p2){//按字符串长度匹配
if(!p1&&!p2)
return true;

if(!p1||!p2)
return false;

if(strlen(p1)!=strlen(p2))
return false;
int k=strlen(p1);
for(int i=0;i<k;i++){
if(cmp(p1+i,p2,k-i)&&cmp(p1,p2+k-i,i))
  return true;
}
return false;
}

int _tmain(int argc, _TCHAR* argv[])
{
char p1[]="ABCD";
char p2[]="BCDA";

if(decision(p1,p2))
cout<<"true"<<endl;
else
cout<<"False"<<endl;
}

发表于 2015-08-05 13:58:06 回复(0)
public class Testsss {
public static void main(String[] args) {
String str = "ABCDE";
String str1 = "EBACD";

String firstLetter = str.substring(0, 1);

int indexOf = str1.indexOf(firstLetter);

String substring1 = str1.substring(0, indexOf).trim();
String substring2 = str1.substring(indexOf + 1, str1.length()).trim();

if (str.contains(substring1)) {

if (substring2.length() != 0) {
String replace = str.replace(substring1, " ").replace(
substring2, " ").trim();

if (firstLetter.equals(replace)) {

System.out.println("可以");
}

} else {
if (substring1.length() == str.length() - 1) {
System.out.println("可以");
}
}

}

}
}
发表于 2015-07-29 22:39:53 回复(0)

public class Question2 {
    private static void reverseCharArr(char[] arr, int left, int right) {
        if (arr == null || left > right) return;

        while (left < right) {
            char tmp = arr[left];
            arr[left] = arr[right];
            arr[right] = tmp;

            left++;
            right--;
        }
    }

    public static void main(String[] args) {
        System.out.println(isRotate("ABCD", "DABC"));
    }

    private static String rotate(String str, int i) {
        if (str == null || i > str.length()) return null;

        char arr[] = str.toCharArray();
        reverseCharArr(arr, 0, i-1);
        reverseCharArr(arr, i, arr.length-1);
        reverseCharArr(arr, 0, arr.length-1);

        return new String(arr);
    }

    public static boolean isRotate(String s1, String s2) {
        if (s1 == null || s2 == null || s2.length() != s1.length()) return false;

        int indexOfFirst = s2.indexOf(s1.charAt(0));

        if (indexOfFirst == -1) return false;

        System.out.println(indexOfFirst);

        String tmp = rotate(s2, indexOfFirst);
        System.out.println(tmp);

        if (tmp.equals(s1)) {
            return true;
        }
        return  false;
    }


}

发表于 2015-04-06 13:12:24 回复(1)