国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發(fā) > Java > 正文

Java 判斷兩個(gè)字符串是否由相同的字符組成的實(shí)例

2024-07-14 08:41:43
字體:
供稿:網(wǎng)友

問題:由相同的字符組成是指兩個(gè)字符串,字母以及各個(gè)字母的個(gè)數(shù)是相同的,只是順序不同。如:“aaaabbc”與“abcbaaa”是由相同字符組成。

方法一:排序法,也是最容易想到的方法,將兩個(gè)字符串轉(zhuǎn)換為字節(jié)數(shù)組,分別排序后,判斷是否相同即可。

方法二:集合法(空間換時(shí)間),利用Map集合key的唯一性,遍歷第一個(gè)字符串,將字符作為key,字符出現(xiàn)的次數(shù)作為value,若遇到重復(fù)字符則將value+1。之后遍歷第二個(gè)字符串,遇到字符就將對應(yīng)的value-1,若value值為1時(shí),就將該字符remove掉。最后判斷map是否為空,為空則說明兩字符串相同。

方法三:數(shù)組法(空間換時(shí)間):由于ASCII字符共266個(gè),,申請一個(gè)字節(jié)數(shù)組byte[256],初始化為0,然后遍歷第一個(gè)字符串,將對應(yīng)的ASCII下標(biāo)+1,然后遍歷第二個(gè)字符串,將對應(yīng)標(biāo)-1。若最后數(shù)組中各個(gè)元素的值都是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("集合用時(shí):"+(l4-l3));				long l1=System.currentTimeMillis();		System.out.println(compare2(s1,s2));		long l2=System.currentTimeMillis();		System.out.println("數(shù)組用時(shí):"+(l2-l1));	} }

為了測試,兩個(gè)方法的運(yùn)行時(shí)間,構(gòu)造較大的字符串,運(yùn)行結(jié)果:

true集合用時(shí):54毫秒true數(shù)組用時(shí):17毫秒

由此可見,數(shù)組法的運(yùn)行效率更高,若在對空間沒要求的情況下,推薦使用第三種方法。

以上這篇Java 判斷兩個(gè)字符串是否由相同的字符組成的實(shí)例就是小編分享給大家的全部內(nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持VeVb武林網(wǎng)。


注:相關(guān)教程知識閱讀請移步到JAVA教程頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 旅游| 昆明市| 鄂托克前旗| 青铜峡市| 尼玛县| 东明县| 固镇县| 姚安县| 枣强县| 大石桥市| 大埔县| 新龙县| 黄石市| 永定县| 南陵县| 贵定县| 新绛县| 临武县| 合作市| 景德镇市| 襄樊市| 濉溪县| 夏河县| 大关县| 宜兰市| 韶关市| 江川县| 冀州市| 同心县| 图木舒克市| 西盟| 浦江县| 乌恰县| 建阳市| 来宾市| 新昌县| 灵璧县| 额济纳旗| 敦化市| 永嘉县| 奉贤区|