判断两个字符串是否互为变形词

题目

给定两个字符串str1和str2,如果str1和str2中出现的字符种类一样且每种字符出现的次数也一样,那么str1和str2互为变形词。请实现函数判断两个字符串是否互为变形词。

例如:

  • str1="132",str2="321",返回true
  • str1="123",str2="2331",返回false

难度:?

就这样吧

设计

  • 一个接收两个字符串的判断并返回布尔值的方法
boolean isDeformation(String str1,String str2){}
  • 互为变形词实质上就是判断两字符串长度是否等同,与字符是否共同出现过,当然共同出现的字符个数是否相等
    • 先从简单的入手,设置第一层过滤条件
    if(str1 == null || str2 == null || str1.length() != str2.length()){
        return false;
    }
    • 将字符串转换为字符数组存储,方便遍历及校对工作
            str1.toCharArray();
            str2.toCharArray();
    • 进行字符数组遍历
    /**
    * 相同的字符替换抹去,跳出当前循环,外层循环继续遍历比对
    */
    for (char char1 : str1.toCharArray()) {
    
            boolean isSameChar = false;
    
            for (char char2 : str2.toCharArray()) {
    
                if (char1 == char2) {
                    str2 = str2.replaceFirst(String.valueOf(char2), "");
                //此flag标记已影响下一层的 isSameChar 变量值
                    isSameChar = true;
                    break;
                }
            }
            /** 
            * 比对过程中总有相同的字符,然而并不是所有的字符都相同 ,所以还是置为false
            * 若是满足isSameChar都为true的过程,且退出外层循环,直接返回true便是
            * */
            if (!isSameChar) {
                return false;
            }
        }

实现

import org.junit.Assert;
import org.junit.Test;

/**
 * @author lorem
 * 类名无特殊含义,取自无聊的动漫罢了
 */
public class LucyStarTest {
    @Test
    public void test(){
        String str1 = null;
        String str2 = null;
        Assert.assertFalse(isDeformation(str1, str2));
    }
    private boolean isDeformation(String str1, String str2){

        if (str2 == null || str1 == null || str1.length() != str2.length()){
            return false;
        }
        for (char char1:str1.toCharArray()) {

            boolean isSameChar = false;

            for (char char2:str2.toCharArray()) {

                if (char1 == char2){
                    str2 = str2.replaceFirst(String.valueOf(char2),"");
                    isSameChar = true;
                    break;
                }
            }
            if (!isSameChar){
                return false;
            }
        }
        return true;
    }
}

感谢好朋友的帮助:DreamBroke

设计 (拙)

  • 一个接收两个字符串的判断并返回布尔值的方法
boolean isDeformation(String str1,String str2){}
  • 互为变形词实质上就是判断两字符串长度是否等同,与字符是否共同出现过,当然共同出现的字符个数是否相等
    • 先从简单的入手,设置第一层过滤条件
    if(str1 == null || str2 == null || str1.length() != str2.length()){
        return false;
    }
    • 比对两个字符串变量中的每个字母是否共同出现过(ASCII)
      • 将字符串作为字符数组存储
        java char[] chars1 = str1.toCharArray(); char[] chars2 = str2.toCharArray();
      • 一个记录字符出现频次的计数器,字符作为独立的个体存在,还是需要用数组作为每个字符出现频次的计数器,这篇资料 ASCII码 很好的说明了ASCII的取值范围
        java int[] ints = new int[256];
      • 记录字符的出现频次
        • 记录str1的字符出现频次
         for (int i = 0; i < chars1.length; i++) {
                ints[chars1[i]]++;
        }
        • 再以此进行比对 str2 的字符出现频次
         for (int i = 0; i < chars2.length; i++) {
                if(ints[chars2[i]] == 0){
                    return false;
                } else {
                        ints[chars2[i]]--;
            }
        }
        /** 满足条件跳出并返回true */
        return true;

实现(拙)

import org.junit.Assert;
import org.junit.Test;

/**
 * @author lorem
 */
public class StringStringGoTest {
    boolean isDeformation(String str1, String str2) {

        if (str1 == null || str2 == null || str1.length() != str2.length()) {
            return false;
        }
        char[] chars1 = str1.toCharArray();
        char[] chars2 = str2.toCharArray();
        int[] ints = new int[256];
        for (int i = 0; i < chars1.length; i++) {
            ints[chars1[i]]++;
        }
        for (int i = 0; i < chars2.length; i++) {
            if (ints[chars2[i]] == 0) {
                return false;
            }else {
                            ints[chars2[i]]--;
                }
        }
        return true;
    }
    @Test
    public void test(){
        String str1 = "asd";
        String str2 = "asd";
        Assert.assertEquals(true,isDeformation(str1,str2));
    }
}

转载于:https://www.cnblogs.com/hoodiearon/p/9735300.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值