zoukankan      html  css  js  c++  java
  • LeetCode : Find All Anagrams in a String

    Given a string s and a non-empty string p, find all the start indices of p’s anagrams in s.

    Strings consists of lowercase English letters only and the length of both strings s and p will not be larger than 20,100.

    The order of output does not matter.

    Example 1:

    Input:
    s: “cbaebabacd” p: “abc”

    Output:
    [0, 6]

    Explanation:
    The substring with start index = 0 is “cba”, which is an anagram of “abc”.
    The substring with start index = 6 is “bac”, which is an anagram of “abc”.
    Example 2:

    Input:
    s: “abab” p: “ab”

    Output:
    [0, 1, 2]

    Explanation:
    The substring with start index = 0 is “ab”, which is an anagram of “ab”.
    The substring with start index = 1 is “ba”, which is an anagram of “ab”.
    The substring with start index = 2 is “ab”, which is an anagram of “ab”.
    http://blog.csdn.net/shiyang6017/article/details/52901357

    class Solution {
    public:
        vector<int> findAnagrams(string s, string p) {
            vector<int> cnt(27, 0);
            for (char ch : p)
                cnt[ch - 'a']++;
            vector<int> ret;
            int start = 0;
            s += '{'; // 哨兵  
            /*
            * 若不添加哨兵,代码量会稍微大些,比较麻烦
            * 考虑不添加哨兵,若s[i, s.size() - 1]满足条件时,下面for循环会溜掉这种情况。
            */
            for (int i = 0; i < s.size(); ++i)
            if (--cnt[s[i] - 'a'] < 0){
                if (i - start == p.size())
                    ret.push_back(start);
                while (cnt[s[i] - 'a'] < 0 && start < s.size())
                    ++cnt[s[start++] - 'a'];
            }
            return ret;
        }
    };
    
    class Solution {
    public:
        vector<int> findAnagrams(string s, string p) {
            vector<int> pv(256,0), sv(256,0), res;
            if(s.size() < p.size())
               return res;
            for(int i = 0; i < p.size(); ++i)
            {
                ++pv[p[i]];
                ++sv[s[i]];
            }
            if(pv == sv)
               res.push_back(0);
            for(int i = p.size(); i < s.size(); ++i)
            {
                ++sv[s[i]];
                --sv[s[i-p.size()]];
                if(pv == sv)
                   res.push_back(i-p.size()+1);
            }
            return res;
        }
    };
  • 相关阅读:
    关于LINUX文件与目录的问题说明
    poj1094拓扑排序
    poj3026(bfs+prim)最小生成树
    快速幂
    hdu4255筛素数+广搜
    网易2012校园招聘笔试题目
    网新恒天2011.9.21招聘会笔试题
    HDU3344(小广搜+小暴力
    HDU3348(贪心求硬币数
    HDU3345广搜 (P,E,T,#)
  • 原文地址:https://www.cnblogs.com/chankeh/p/6850077.html
Copyright © 2011-2022 走看看