1. 程式人生 > >[演算法]判斷兩個字串是否由相同的字元組成

[演算法]判斷兩個字串是否由相同的字元組成

如何判斷兩個字串是否由相同的字元組成

題目描述:

由相同的字元組成是指組成兩個字串的字母以及各個字母的個數是一樣的,只是排列順序不同而已。例如”aaaabbc”與”abcbaaa”就由相同的字元組成的。

方法一:

排序法,將兩個字串中的字元排序,比較兩個排序後的字串是否相等。若相等則表明它們是由相同的字元組成的,否則,表明他們是由不同的字元組成的。

import java.util.Arrays;

public class Solution {

    public static void compare(String s1,String s2){
        byte
[] b1 = s1.getBytes(); byte[] b2 = s2.getBytes(); Arrays.sort(b1); Arrays.sort(b2); s1 = new String(b1); s2 = new String(b2); if(s1.equals(s2)){ System.out.println("equal"); }else { System.out.println("not equal"); } } public
static void main(String[] args) { String s1 = "aaaabbc"; String s2 = "abcbaaa"; compare(s1, s2); s1 = "aaaabbc"; s2 = "abcbaab"; compare(s1, s2); } }

以上方法取決於排序演算法的時間複雜度,由於最快的排序演算法的時間複雜度為O(nlogn),因此,該方法的時間複雜度也為O(nlogn)。

方法二:

空間換時間,假設字串只使用ASCAII字元,由於ASCAII字元只有266個(對應的編碼為0~255),在實現時可以通過申請大小為266的陣列來記錄各個字元出現的個數,並初始化為0,然後遍歷第一個字串,將字串中字元對應的ASCII碼值作為陣列下標,把對應陣列的元素加1,然後遍歷第二個字串,把陣列中對應的元素值-1.如果最後陣列中各個元素的值都為0,說明這兩個字串是由相同的字元組成的;否則,說明這兩個字串是由不同的字元組成的。

程式碼如下:

package 判斷兩個字串是否由相同的字元組成;

public class Solution1 {

    public static void compare(String s1, String s2) {
        byte[] b1 = s1.getBytes();
        byte[] b2 = s2.getBytes();
        int[] bCount = new int[256];
        for (int i = 0; i < 256; i++) {
            bCount[i] = 0;
        }
        for (int i = 0; i < b1.length; i++) {
            bCount[b1[i] - '0']++;
        }
        for (int i = 0; i < b2.length; i++) {
            bCount[b2[i] - '0']--;
        }

        for (int i = 0; i < 256; i++) {
            if (bCount[i] != 0) {
                System.out.println("not equal");
                return;
            }
        }
        System.out.println("equal");
    }


    public static void main(String[] args) {
        String s1 = "aaaabbc";
        String s2 = "abcbaaa";
        compare(s1, s2);
        s1 = "aaaabbc";
        s2 = "abcbaab";
        compare(s1, s2);
    }
}

方法二時間複雜度為O(n),但是申請了額外的空間。