zoukankan      html  css  js  c++  java
  • Cracking the coding interview--Q1.4

    题目

    原文:

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

    译文:

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

    解答

    变位词(anagrams)指的是组成两个单词的字符相同,但位置不同的单词。比如说, abbcd和abcdb就是一对变位词。该题目有两种做法:

    O(nlogn)的解法

    由于组成变位词的字符是一模一样的,所以按照字典序排序后,两个字符串也就相等了。 因此我们可以用O(nlogn)的时间去排序,然后用O(n)的时间比较它们是否相等即可。

    代码如下:

        public static boolean isAnagraml(String s1, String s2) {
            if (s1.length() != s2.length())
                return false;
            char[] cs1 = s1.toCharArray();
            char[] cs2 = s2.toCharArray();
            Arrays.sort(cs1);
            Arrays.sort(cs2);
            for (int i=0; i<cs1.length; i++) {
                if (cs1[i] != cs2[i])
                    return false;
            }
            return true;
        }

    O(n)的解法

    由于组成变位词的字符是一模一样的, 因此我们可以先统计每个字符串中各个字符出现的次数, 然后看这两个字符串中各字符出现次数是否一样。如果是,则它们是一对变位词。 这需要开一个辅助数组来保存各字符的出现次数。我们可以开一个大小是256的整数数组, 遍历第一个字符串时,将相应字符出现的次数加1;遍历第二个字符串时, 将相应字符出现的次数减1。最后如果数组中256个数都为0,说明两个字符串是一对变位词。 (第1个字符串中出现的字符都被第2个字符串出现的字符抵消了), 如果数组中有一个不为0,说明它们不是一对变位词。

    代码如下:

        public static boolean isAnagramloN(String s1, String s2) {
            if (s1.length() != s2.length())
                return false;
            int[] h = new int[256];
            for (int c : s1.toCharArray()) {
                h[c]++ ;
            }
            for (int c : s2.toCharArray()) {
                h[c]--;
            }
            for (int it : h) {
                if (it !=0 )
                    return false;
            }
            return true;
        }
  • 相关阅读:
    webdav srs相关
    How To Configure WebDAV Access with Apache on Ubuntu 14.04
    ubuntu 编译lighttpd
    srs编译及推流测试
    Compile pciutils (lspci, setpci) in Windows x86,在 Windows x86 平台下编译 pciutils (lspci, setpci)
    mingw MSYS2 区别
    Qt之美(三):隐式共享
    Qt之美(二):元对象
    Qt之美(一):d指针/p指针详解
    C++的栈空间和堆空间
  • 原文地址:https://www.cnblogs.com/549294286/p/3190821.html
Copyright © 2011-2022 走看看