CM3 确定两串乱序同构

题目描述

给定string stringA和string stringB,编写程序确认两字符串包含的字符是否完全相同,注意大小写为不同字符,且考虑字符串中的空格,返回一个bool,代表两串是否由一样的字符组成。保证两串的长度都小于等于5000。

测试样例:
“This is nowcoder”,“is This nowcoder”
返回:true
“Here you are”,“Are you here”
返回:false

思路

一、 使用两个 256 长度数组 map1,map2 进行比较, 然后比较每一位的数值是否相等, 不相等直接返回 false, 如果比较到最后返回 true。
二、 比较单词, 首先划分单词,然后排序进行比较(或者使用hashmap再进行比较),比较单词不相等则返回 false, 否则返回true。
三、由于题目并未要求一定是 单词 所以可以考虑使用 重排所有字符进行比较。

代码实现如下:

代码

package june.code.byhehe.book.GoldBook;

import java.util.Arrays;
import java.util.Comparator;

public class CM3MakeSure {
    public static void main(String[] args) {
        CM3 cm3 = new CM3();
        String a = "This is nowcoder";
        String b = "is This nowcoder";
        System.out.println(cm3.checkSam(a, b));
        System.out.println(cm3.checkSam2(a,b));
        System.out.println(cm3.checkSam3(a,b));
    }
}

class CM3{
    // 考虑使用 256 长度进行判断 或者使用 map 进行判断
    // 空间:O(n)   时间:O(n)
    public boolean checkSam(String stringA, String stringB) {
        // write code here
        // 考虑判断长度
        if(stringA.length() != stringB.length())
            return false;

        int[] map1 = new int[256];
        int[] map2 = new int[256];

        for (int i = 0; i < stringA.length(); i++) {
            char c = stringA.charAt(i);
            char c2 = stringB.charAt(i);
            map1[c]++;
            map2[c2]++;
        }

        for (int i = 0; i < 256; i++) {
            if(map1[i]!=map2[i])
                return false;
        }
        return true;
    }
    // 重排单词 进行比较
    // 空间:O(n)   时间:O(nlogn)
    public boolean checkSam2(String stringA, String stringB) {
        String[] splitA = stringA.split(" ");
        String[] splitB = stringB.split(" ");
        if(splitA.length!=splitB.length)
            return false;

        Arrays.sort(splitA, new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                return o1.compareTo(o2);
            }
        });

        Arrays.sort(splitB, new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                return o1.compareTo(o2);
            }
        });

        for (int i = 0; i < splitA.length; i++) {
            if(!splitA[i].equals(splitB[i]))
                return false;
        }
        return true;
    }

    // 还有一种方法 基于上面的重排单词 , 由于题目并未严格要求 以单词为基准, 所以我们可以重排所有字符进行比较
    // 空间:O(n)  时间:O(n)
    public boolean checkSam3(String stringA, String stringB) {
        // 需要借助 char 数组
        if(stringA.length()!=stringB.length())
            return false;

        char[] chars1 = stringA.toCharArray();
        char[] chars2 = stringB.toCharArray();

        Arrays.sort(chars1);
        Arrays.sort(chars2);
        // 直接调用 Arrays.equals 方法来进行比较
        return Arrays.equals(chars1, chars2);

        /*
        // 没必要 再写 其实 Arrays 里面源码就是这样写的
        for (int i=0; i<length; i++)
            if (a[i] != a2[i])
                return false;
         */
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值