cci-Q1.4 判断两个字符串是否为变位词

原文:

Write a method to decide if two strings are anagrams or not.

译文:

写一个函数判断两个字符串是否是变位词。

An anagram is a type of word play, the result of rearranging the letters of a word or phrase to produce a new word or phrase, using all the original letters exactly once; for example orchestra can be rearranged into carthorse.

易位构词是一类文字游戏(更准确地说是一类“词语游戏”),是将组成一个词或短句的字母重新排列顺序,原文中所有字母的每次出现都被使用一次,这样构造出另外一些新的词或短句。

易位构词通常用一种等式的形式来表示,用等号“=”分开原文和变换后的结果,例如用这种形式表示的一个简单的易位变换是“earth = heart”。在一种更高级、更微妙的易位构词游戏的形式中,游戏目标是“发现”一个能用一种幽默或讽刺的方式定义或解释原词语的、且具有语言上的含义(即语言上可理解)的结果,例如“Roll in the hay = Thrill a honey”(由 Tony Crafter 发现)。在原词可以和变化的结果连成一个完整句子时,就用波浪线“~”代替等号把它们连起来,例如“Semolina ~ is no meal.”

  private static String sort(String b) {
        char[] strArr = b.toCharArray();
        int len = strArr.length;
        char tmp;
        for (int i = 0; i < len; i++) {
            for (int j = 1; j < len - i; j++) {
                if (strArr[j] > strArr[j - 1]) {
                    tmp = strArr[j];
                    strArr[j] = strArr[j - 1];
                    strArr[j - 1] = tmp;
                }
            }
        }
        return String.valueOf(strArr);
    }

    public static boolean isAnagram(String a, String b) {
        if (a == null || b == null) {
            return false;
        }
        String aR = a.replaceAll(" ", "");
        String bR = b.replaceAll(" ", "");

        return sort(aR).equals(sort(bR));
    }

junit testcase

    @Test
    public void testIsAnagram() {
        System.out.println("isAnagram");
        assertEquals(true, q1_4.isAnagram("abc", "cba"));
        assertEquals(true, q1_4.isAnagram("abc", "abc"));
        assertEquals(false, q1_4.isAnagram("abc", "abca"));
        assertEquals(false, q1_4.isAnagram(null, null));
        assertEquals(true, q1_4.isAnagram("abc                 123", "123   abc"));
        assertEquals(true, q1_4.isAnagram("   1 ", "1"));
    }

2,使用计数数组,记录第一个字符串中每个字符出现的次数,遍历第二个字符串,对应计数数组-1,最后遍历计数数组,如果存在不为0即不是变位词

public static boolean isAnagram2(String a, String b) {
        if (a == null || b == null) {
            return false;
        }
        String aR = a.replaceAll(" ", "");
        String bR = b.replaceAll(" ", "");

        char[] aArr = aR.toCharArray();
        char[] bArr = bR.toCharArray();
        int[] flag = new int[256];

        for (char c : aArr) {
            flag[c]++;
        }

        for (char c : bArr) {
            flag[c]--;
        }

        for (int i : flag) {
            if (i != 0) {
                return false;
            }
        }
        return true;
    }

junit testcase

    @Test
    public void testIsAnagram2() {
        System.out.println("isAnagram2");
        assertEquals(true, q1_4.isAnagram2("abc", "cba"));
        assertEquals(true, q1_4.isAnagram2("abc", "abc"));
        assertEquals(false, q1_4.isAnagram2("abc", "abca"));
        assertEquals(false, q1_4.isAnagram2(null, null));
        assertEquals(true, q1_4.isAnagram2("abc                 123", "123   abc"));
        assertEquals(true, q1_4.isAnagram2("   1 ", "1"));
        assertEquals(false, q1_4.isAnagram2("aaaaaaaaaaaaaaaaa", "aaaaaaa"));
        assertEquals(true, q1_4.isAnagram2("aaaaaaaaaaaaaaaaa", "aaaaaaaaaaaaaaaaa"));
    }









  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值