以下是Java实现:
public class StringRotation { public static boolean isRotation(String a, String b) { if (a.length() != b.length()) { return false; } String doubleA = a + a; return doubleA.contains(b); } public static void main(String[] args) { String a = "asdf"; String b = "sdfa"; System.out.println(isRotation(a, b)); // true } }
首先,检查字符串a和b的长度是否相等,如果不相等则一定不可能通过移动得到字符串b,直接返回false。接下来,将字符串a复制一份拼接到自身后面得到一个新字符串doubleA,然后判断字符串b是否是doubleA的子串,如果是,则说明字符串a通过移动可以得到字符串b,返回true,否则返回false。
可以进一步扩展这个程序,让它可以接受用户输入。以下是更完整的Java代码:
import java.util.Scanner; public class StringRotation { public static boolean isRotation(String a, String b) { if (a.length() != b.length()) { return false; } String doubleA = a + a; return doubleA.contains(b); } public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.print("Enter string a: "); String a = scanner.nextLine(); System.out.print("Enter string b: "); String b = scanner.nextLine(); boolean result = isRotation(a, b); System.out.println("String a can " + (result ? "" : "not ") + "be rotated to form string b."); } }
该程序先创建一个Scanner对象来读取用户输入。然后提示用户输入字符串a和b,分别读取两个字符串。调用isRotation方法来判断字符串a是否可以通过移动得到字符串b,将结果存储在一个布尔变量result中。最后根据结果输出一条信息告诉用户字符串a是否可以被旋转得到字符串b。
我们可以进一步完善isRotation方法,使其支持更多的情况。比如,如果字符串a和b的长度不等,则可以直接返回false;如果字符串a和b相等,则也可以直接返回true。
另外,可以通过比较字符串a和b的字符来判断它们是否可以通过移动得到。具体地,可以从0到a.length() - 1枚举移动的位数,将字符串a分成两部分,分别是a.substring(i)和a.substring(0, i),然后将它们拼接起来得到一个新字符串,如果该新字符串与字符串b相等,则说明字符串a可以通过移动得到字符串b。
以下是更新后的Java代码:
import java.util.Scanner; public class StringRotation { public static boolean isRotation(String a, String b) { if (a.length() != b.length()) { return false; } if (a.equals(b)) { return true; } for (int i = 1; i < a.length(); i++) { String rotatedA = a.substring(i) + a.substring(0, i); if (rotatedA.equals(b)) { return true; } } return false; } public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.print("Enter string a: "); String a = scanner.nextLine(); System.out.print("Enter string b: "); String b = scanner.nextLine(); boolean result = isRotation(a, b); System.out.println("String a can " + (result ? "" : "not ") + "be rotated to form string b."); } }
现在,isRotation方法会先检查字符串a和b的长度是否相等,如果不相等则直接返回false;如果相等,则可以判断字符串a是否与字符串b相等,如果相等则直接返回true。如果字符串a和b不相等且长度相等,则需要枚举所有可能的移动位数,拼接字符串a得到新字符串rotatedA,如果rotatedA与字符串b相等,则说明字符串a可以通过移动得到字符串b,返回true。如果枚举完所有位数后仍没有找到可以得到字符串b的方法,则返回false。
这个程序可以处理大多数情况,但是当字符串a和b很长时,枚举所有可能的移动位数可能会非常耗时。如果我们知道字符串a和b中哪些字符相同,哪些字符不同,可以利用这些信息快速判断是否可以通过移动得到字符串b。
原文链接:codingdict.net