java字符串练习,给定两个字符串,a和b,a从最左边移动到最右边,若a=asdf,移动后为sdfa


以下是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