如何判斷一個字串是否由相同的字元組成
問題描述:由相同的字元組成是指組成兩個字串的字母以及各個字母的個數是一樣的,只是排列順序不同而已,例如“aaaabbc"與”abcbaaa"就由相同的字元組成的。下面描述判斷給定的兩個字串是否由相同的字元組成的方法。
方法一:排序法。最容易想到的方法就是對兩個字串中的字元進行排序,比較兩個排序後的字串是否相等。若相等,則表明他們是由相同的字元組成的,否則,表明它們不是由相同的字元組成 的。實現程式碼如下:
以上方法的時間複雜度取決於排序演算法的時間複雜度,由於最快的排序演算法的時間複雜度為O(nlogn),因此,該方法的時間複雜度也為O(nlogn)package test; import java.util.Arrays; public class Test{ 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("equals"); else System.out.println("not equals"); } public static void main(String[] a){ String s1="aaaabbc"; String s2="abcbaaa"; compare(s1,s2); s1="aaaabbc"; s2="abcbaab"; compare(s1,s2); } }
方法二:空間換時間。在演算法設計中,經常會採用空間換時間的方法以降低時間的複雜度,即通過增加額外的儲存空間來達到優化演算法的效果。就本題而言,假設字串中只是用ASCII字元,由於ASCII字元共有256個(對應的編碼為0——255),在實現時可以通過申請大小為256的陣列來記錄各個字元出現的次數,並初始化為0,然後遍歷第一個字串,將字串中字元對應的ASCII碼值作為陣列下標,把對應陣列的元素加1,然後遍歷第二個字串,把陣列中對應的元素值減1.如果最後陣列中各個元素的值都為0,說明這兩個字串是相同的字元組成的;否則,說明這兩個字串是由不同的字元組成 的。示例程式碼如下:
package test;
import java.util.Arrays;
public class Test{
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
與方法一相比,方法二多申請了額外的儲存空間,但是提高了演算法的效率,該演算法的時間複雜度為O(n).