1. 程式人生 > >字串--------如何判斷兩個字串是否由相同的字元組成

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

問題描述:

         由相同的字元組成是指兩個字串,字母以及各個字母的個數是相同的,只是順序不同。如:“aaaabbc”與“abcbaaa”是由相同字元組成。

演算法思路:

方法一:排序法,也是最容易想到的方法,將兩個字串轉換為位元組陣列,分別排序後,判斷是否相同即可。

package JBString;

import java.util.Arrays;

public class Compare {
	public static void compare(String s1, String s2) {
		// char[] b1 = s1.toCharArray();
		// char[] b2 = s1.toCharArray();
		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 str1 = "gdeacbf";
		String str2 = "gdeacbf";
		compare(str1, str2);
		str1 = "gdeacbf";
		str2 = "hmgdeacbf";
		compare(str1, str2);
	}
}

方法二:集合法(空間換時間),利用Map集合key的唯一性,遍歷第一個字串,將字元作為key,字元出現的次數作為value,若遇到重複字元則將value+1。之後遍歷第二個字串,遇到字元就將對應的value-1,若value值為1時,就將該字元remove掉。最後判斷map是否為空,為空則說明兩字串相同。

方法三:陣列法(空間換時間):由於ASCII字元共266個,,申請一個位元組陣列byte[256],初始化為0,然後遍歷第一個字串,將對應的ASCII下標+1,然後遍歷第二個字串,將對應標-1。若最後陣列中各個元素的值都是0,則說明字串相等,反之不等。

package CharString;
 
import java.util.HashMap;
import java.util.Map;
 
public class CompareString {
 
	public static boolean compare(char[] a,char[] b){
		int aLen = a.length;
		int bLen = b.length;
		if(aLen!=bLen){
			return false;
		}
		Map<Character,Integer> map = new HashMap<Character,Integer>();
		for(int i=0;i<aLen;i++){
			if(map.containsKey(a[i])){
				map.put(a[i], map.get(a[i])+1);
			}else{
				map.put(a[i], 1);
			}
		}
		for(int j=0;j<bLen;j++){
			if(map.containsKey(a[j])&&map.get(a[j])==1){
				map.remove(a[j]);
			}else{
				map.put(a[j], map.get(a[j])-1);
			}
		}
		return map.isEmpty();
		
	}
	
	public static boolean compare2(String a,String b){
		byte[] b1 = a.getBytes();
		byte[] b2 = b.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)
				return false;
		}
		return true;
	}
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
 
		StringBuffer s11 = new StringBuffer();
		StringBuffer s22 =  new StringBuffer();
		for(int i=0;i<10000;i++){
			s11.append("aybcybayaatt");
		}
		for(int i=0;i<10000;i++){
			s22.append("aybcybayaatt");
		}
		String s1 = s11.toString();
		String s2 = s22.toString();
		char[] a = s1.toCharArray();
		char[] b = s2.toCharArray();
		
		long l3=System.currentTimeMillis();
		System.out.println(compare(a,b));
		long l4=System.currentTimeMillis();
		System.out.println("集合用時:"+(l4-l3));
		
		long l1=System.currentTimeMillis();
		System.out.println(compare2(s1,s2));
		long l2=System.currentTimeMillis();
		System.out.println("陣列用時:"+(l2-l1));
	}
 
}

相關推薦

如何判斷字串是否相同字元組成

package java程式設計師面試筆試寶典; import java.util.Arrays; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.

字串--------如何判斷字串是否相同字元組成

問題描述:          由相同的字元組成是指兩個字串,字母以及各個字母的個數是相同的,只是順序不同。如:“aaaabbc”與“abcbaaa”是由相同字元組成。 演算法思路: 方法一:排序法,也是最容易想到的方法,將兩個字串轉換為位元組陣列,分別排序後,判斷是否相

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

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

判斷子串和判斷字串是否另一個旋轉而來的問題

題目:假定又一個IsSubString,可檢查一個單詞是否為其他字串的子串。給定兩個字串s1和s2,請編寫程式碼檢查s2是否為s1旋轉而成,要求只能呼叫一次IsSubString。(比如,waterb

判斷字串是否相同

data segment mess1 db 'computer software $' mess2 db 'computer software $' data ends code segment ass

go判斷字串是否是是相互打亂的,也就是說它們有著相同字元,但 是對應不同的順序。

package main import ( "fmt" "strings" "unicode/utf8" ) func main() { fmt.Println(string([]rune("starting chat...")[2])) fmt.Printl

判斷字串是否包含相同字元(但是允許順序不一樣)

ABCC 在這裡equals CBAC 先比較字串長度就不說了 最笨拙的方法,遍歷A字串,然後再去遍歷B字串, 開一個新陣列標記B上某位是否已匹配過。——O(n^2) 好一點的思路走向 字串其實就是char陣列,每一位的字元其實都是數字 所以“ABCC”

sql 判斷字串是否存在相同的內容

-- ============================================= -- Author:  wuchaorang -- Create date: 2010-12-22 -- Description: 判斷兩個字串是否存在相同的內容(查詢@ne

怎麼判斷陣列是否為空?怎麼判斷字串不等?怎麼判斷字串相等?

陣列 首先來看這個案例: String sz[]=new String[8]; if(sz!=null){ System.out.println("hahah1"); } String szz[]=null; if(szz!=null){ System.out.prin

js怎麼判斷字串是否相等?

第一種、 <%     String bg=request.getParameter("bg");         if(bg==null||"".equals(bg)){   

判斷字串不同的json是否等價(附:將等價但是不同json調整成同一字串的方法)

在做軟體和網路測試的時候,經常需要對排版格式與內部結構順序不固定的json物件進行分析對比,而json基本語法下,同樣的一個json物件,字串變化可以千變萬化,json內各個層欄位順序調轉,排版變化,打亂順序的json陣列+多層巢狀,等等各種因素,都會造成對比上的困難。 以下由淺及深談談幾種

1.1 MySQL判斷字串是否有交集

1.1.1 設定log_bin_trust_function_creators log_bin_trust_function_creators控制是否可以信任儲存函式建立者,不會建立寫入二進位制日誌引起不安全事件的儲存函式。如果設定為0(預設值),使用者不得建立或修改儲存函式,除非它

判斷字串是否是旋轉數

package string; public class Xuanzhan { //本題的解法非常 簡單, 如果 a 和 b 的 長度不一 樣, 字串 a 和 b 不可能互為旋轉詞

判斷字串是否相等

將兩個字串比較是否相等 要求:給定兩個字串s1,s2並賦值,判斷兩個字串是否相等,若相等則返回0,否則返回1。 包含的引用函式 strlen(s1)取字串的長度 方案一:使用陣列表示,取兩個陣列的長度,k為較長陣列的長度,兩個陣列依次比較字串裡面的內容,如果相等則j+1,比較

JAVA如何判斷字串是否相等

1、java中字串的比較是==比較引用,equals 比較值 so我們經常習慣性的寫上if(str1==str2),這種寫法在java中可能會帶來問題  example1: String a="abc";String b="abc", 那麼a==b將返回true。因為在java

5.1判斷字串是否互為變形詞

題目 給定兩個字串str1和str2,如果str1和str2中出現的字串種類一樣且每種字元出現的次數也一樣,那麼str1與str2互為變形詞。請實現函式判斷兩個字串是否互為變形詞。 程式碼實現 public boolean isDeformation (Str

290. Word Pattern(技巧:記錄當前位置來判斷字串是否符合)

Given a pattern and a string str, find if str follows the same pattern. Here follow means a full match, such that there is a bijection

**題目描述:長度不超過80的字串,串中包括大寫、小寫和空格字元,去掉空格字元並忽略大小寫後判斷字串是否相等。

題目描述:兩個長度不超過80的字串,串中包括大寫、小寫和空格字元,去掉空格字元並忽略大小寫後判斷兩個字串是否相等。 輸入描述:第一行輸入的是測試資料的組數n,每組測試資料佔兩行,第一行是第一個字串S1,第二行是第二個字串S2。 輸出描述:如果兩個字串相等,則輸出YES,否則輸出NO。

判斷字串是否是anagram

所謂 anagram, 就是兩個詞所用的字母及其個數都是一樣的,但是,字母的位置不一樣。比如 abcc 和 cbca 就是 anagram. 判斷的方法比較簡單,先把單個字母(字元)轉成整數,然後利用了hashtable+計數器的原理進行判斷。 public static

java 判斷字串相等

在程式設計中,通常比較兩個字串是否相同的表示式是“==” ,但在 Java 中不能這麼寫。在 Java 中,如果要比較 a 字串是否等於 b 字串,需要這麼寫: if(a.equals(b)){ } 返回 true 或 false equals()方法 方法 String