• Careercup


    2014-05-02 01:05

    题目链接

    原题:

    bool anaStrStr (string needle, string haystack) 
    {
    }
    
    Write a function that takes 2 strings , search returns true if any anagram of string1(needle) is present in string2(haystack)

    题目:写一个字符串匹配的函数,但是要求只要能在文本里找到模式的anagram,就返回true。

    解法:对于anagram这词的翻译实在是无力吐槽,居然叫“字谜”。所以不翻译反而更省事。因为要匹配的是模式的所有anagram,我们不需要像KMP算法那样计算模式的失配跳转位置,就可以完成O(n)时间内的算法。我们需要随时维护的,是模式串的字符统计,以及当前文本串的字符统计。我们需要一左一右两个iterator,统计两个iterator之间的字串的字母构成情况。开始两者都在0位置,各个字符统计数也都为0。在扫描过程中,如果数量不足,则右端iterator一直向右移动;如果某个字符数量超过了模式串,则左端iterator一直向右移动。这样的话,两个iterator至多扫描完整个文本串,保证算法是严格线性的。

    代码:

     1 // http://www.careercup.com/question?id=5671785349513216
     2 #include <iostream>
     3 #include <string>
     4 #include <vector>
     5 using namespace std;
     6 
     7 class Solution {
     8 public:
     9     bool anaStrStr (string needle, string haystack) {
    10         int len1, len2;
    11         
    12         len1 = (int)needle.length();
    13         len2 = (int)haystack.length();
    14         
    15         if (len1 == 0) {
    16             return true;
    17         } else if (len2 < len1) {
    18             return false;
    19         }
    20         
    21         memset(cn, 0, 256 * sizeof(int));
    22         memset(ch, 0, 256 * sizeof(int));
    23         int i, j;
    24 
    25         cc = 0;
    26         for (i = 0; i < len1; ++i) {
    27             ++cn[needle[i]];
    28             ++cc;
    29         }
    30         
    31         i = 0;
    32         j = i;
    33         while (true) {
    34             if (cc == 0) {
    35                 return true;
    36             }
    37 
    38             if (i > len2 - len1) {
    39                 return false;
    40             }
    41             
    42 
    43             if (ch[haystack[j]] < cn[haystack[j]]) {
    44                 ++ch[haystack[j]];
    45                 --cc;
    46                 ++j;
    47             } else {
    48                 while (i <= j && ch[haystack[j]] == cn[haystack[j]]) {
    49                     if (ch[haystack[i]] > 0) {
    50                         --ch[haystack[i]];
    51                         ++cc;
    52                     }
    53                     ++i;
    54                 }
    55                 j = i > j ? i : j;
    56             }
    57         }
    58     };
    59 private:
    60     int cn[256], ch[256];
    61     int cc;
    62 };
    63 
    64 int main()
    65 {
    66     string needle, haystack;
    67     Solution sol;
    68     
    69     while (cin >> needle >> haystack) {
    70         cout << (sol.anaStrStr(needle, haystack) ? "true" : "false") << endl;
    71     }
    72     
    73     return 0;
    74 }
  • 相关阅读:
    iOS 微信支付SDK与微信友盟分享两者同时集成时,出现的问题与解决之路。
    Object-C语言Block的实现方式
    使用Mac命令别名,提升工作效率
    利用OC对象的消息重定向forwardingTargetForSelector方法构建高扩展性的滤镜功能
    渐变色进度条的两种绘制方案
    设计模式应用场景之Model设计中可以用到的设计模式
    有趣的赫夫曼树
    技术团队管理者的问题视角
    SSH安全登陆原理:密码登陆与公钥登陆
    为什么HashMap继承了AbstractMap还要实现Map?
  • 原文地址:https://www.cnblogs.com/zhuli19901106/p/3703589.html
Copyright © 2020-2023  润新知