服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|JavaScript|易语言|

服务器之家 - 编程语言 - Java教程 - Java 判断两个字符串是否由相同的字符组成的实例

Java 判断两个字符串是否由相同的字符组成的实例

2021-05-19 12:50半盏鎏年 Java教程

今天小编就为大家分享一篇Java 判断两个字符串是否由相同的字符组成的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

问题:由相同的字符组成是指两个字符串,字母以及各个字母的个数是相同的,只是顺序不同。如:“aaaabbc”与“abcbaaa”是由相同字符组成。

方法一:排序法,也是最容易想到的方法,将两个字符串转换为字节数组,分别排序后,判断是否相同即可。

方法二:集合法(空间换时间),利用map集合key的唯一性,遍历第一个字符串,将字符作为key,字符出现的次数作为value,若遇到重复字符则将value+1。之后遍历第二个字符串,遇到字符就将对应的value-1,若value值为1时,就将该字符remove掉。最后判断map是否为空,为空则说明两字符串相同。

方法三:数组法(空间换时间):由于ascii字符共266个,,申请一个字节数组byte[256],初始化为0,然后遍历第一个字符串,将对应的ascii下标+1,然后遍历第二个字符串,将对应标-1。若最后数组中各个元素的值都是0,则说明字符串相等,反之不等。

先给出方法二,方法三源码:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
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));
    }
 
}

为了测试,两个方法的运行时间,构造较大的字符串,运行结果:

?
1
2
3
4
true
集合用时:54毫秒
true
数组用时:17毫秒

由此可见,数组法的运行效率更高,若在对空间没要求的情况下,推荐使用第三种方法。

以上这篇java 判断两个字符串是否由相同的字符组成的实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持服务器之家。

原文链接:https://blog.csdn.net/wutongyu0123wutongyu/article/details/51702271

延伸 · 阅读

精彩推荐