java 判断字符串重排后是否等于另一个字符串,包括空格符

大家好,很高兴能和你认识,这是本人第一篇博文,本着提升自我而开始的博客之旅

下面只要写的是java字符串重排后是否相等的。

public static void main(String [] args){
    String str1 = " hello World ";
    String str2 = "llo World he";
    boolean res = false;
    for(int i = 0; i < 50; i++){
	res = asEquals(str1, str2);
    }
    System.out.println(res);
}

方案一:直接使用java jdk自带api

分析:判断两个字符串是否相等,把两个字符串重新排列(升序、降序),然后做比较

        第一步:判断两个字符串是否相等,

        第二步:判断两个字符串是否为空

        第三步:判断字符串长度是否相等

        第四步:把两个字符串转为数组,给数组排序,直接排序后是否相等

        完成。

        api:Arrays

    Arrays.sort(obj []);    //数组排序

    Arrays.equals(arr1, arr2);    // 判断两个数组相等

//Arrays.equals() 实现如下

  public static boolean equals(byte[] a, byte[] a2) {
        if (a==a2)
            return true;
        if (a==null || a2==null)
            return false;
        int length = a.length;
        if (a2.length != length)
            return false;
        for (int i=0; i<length; i++)
            if (a[i] != a2[i])
                return false;
        return true;
    }

	
static boolean asEquals(String str1, String str2){
    if(str1 == str2) 
	return true;
    if (str1 == null || str2 == null)
        return false;
    if(str1.length() != str2.length()) 
	return false;
    byte[] arr1 = str1.getBytes();
    byte[] arr2 = str2.getBytes();
    Arrays.sort(arr1);
    Arrays.sort(arr2);
    return Arrays.equals(arr1, arr2);
}

方案二:定义两个可以放下所有字符的数组把两个字符串

中字符出现的次数装起来,循环判断是否相等

分析:所有字符总数为256,定义两个256的数组,下标分别表示字符的ASCII值,对应数值表示出现次数,

static boolean asEquals2(String str1, String str2) {
    if(str1 == str2) return true;    
    //两字符串存在空的情况 
    if (str1 == null || str2 == null) return false; 
    /** * 两字符串都不为空 * 长度不相等则直接返回false */ 
    int len = str1.length(); 
    if (len != str2.length()) return false; 
    int[] strA = new int[256]; 
    int[] strB = new int[256]; 
    for(int i = 0; i < len; i++){ 
        strA[str1.charAt(i)]++; 
        strB[str2.charAt(i)]++; 
    } 
    //遍历数组所有元素,进行对比 
    for (int i = 0; i < 256; i++){ 
        if (strA[i] != strB[i]) return false; 
    } 
    return true;
}
   

方案三:定义一个可以放下所有字符的数组把一个字符串中字符出现的次数装起来,然后循环另一个字符串,没出现一次则--,如果--后小于0表示字符串A的这个字符比字符串B少

	
static boolean asEquals3(String str1, String str2) {
	if(str1 == str2) 
	    return true;
        if (str1 == null || str2 == null)
            return false;
        int len = str1.length();
        if (len != str2.length())
            return false;
        int[] strA = new int[256];
        for(int i = 0; i < len; i++){
            strA[str1.charAt(i)]++;
        }
        for (int i = 0; i < len; i++){
            if (--strA[str2.charAt(i)] < 0)
                return false;
        }
        return true;
    }

总结:经过测试在

    字符串比较短的情况下,方案一和三耗时较少

    字符串较长的情况下,方案二和三耗时较少

优化:方案二和三可以考虑根据字符串长度选择用二或三(是否大于某个值,目的是减少循环的次数)


以上为本人少少挫见,如有错误希望大神指正,或提出更好的方案。

    --有志者事竟成。



这道题需要先理解Z字形的排列方式,然后根据这个方式来进行字符串重排。 Z字形排列的方式如下: 假设字符串为 "LEETCODEISHIRING",行数为 3: L C I R E T O E S I I G E D H N 我们可以将它表示为三行的字符串数组: ["LCIR", "ETOESIIG", "EDHN"] 然后按照顺序将每一行的字符连接起来,得到最终的结果: LCIRETOESIIGEDHN 根据这个方式,我们可以先创建一个字符串数组,用于保存每一行的字符。然后按照Z字形排列的方式,将每个字符依次添加到对应的行中。最后将每一行的字符连接起来即可。 代码实现如下: ```python def convert(s: str, numRows: int) -> str: if numRows == 1: return s rows = ['' for _ in range(numRows)] index, step = 0, 1 for char in s: rows[index] += char if index == 0: step = 1 elif index == numRows - 1: step = -1 index += step return ''.join(rows) ``` 具体实现细节如下: 1. 如果行数为1,则直接返回原字符串; 2. 创建一个字符串数组,用于保存每一行的字符,初始值为 ''; 3. 定义 index 和 step,其中 index 表示当前字符应该添加到哪一行,初始值为 0;step 表示当前字符应该向上还是向下移动,初始值为 1; 4. 遍历字符串中的每个字符: - 将当前字符添加到 rows[index] 中; - 如果 index == 0,则 step = 1,即后面的字符应该向下移动; - 如果 index == numRows - 1,则 step = -1,即后面的字符应该向上移动; - index += step,更新当前字符应该添加到哪一行; 5. 将每一行的字符连接起来,得到最终的结果。 时间复杂度为 O(n),其中 n 为字符串的长度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值