美文网首页
[LintCode] Substring Anagrams

[LintCode] Substring Anagrams

作者: 碎冰op | 来源:发表于2017-08-23 22:35 被阅读71次

不是专门刷LintCode也没时间没耐心,只是刷贴吧看到这个问题就看了一下发现Python真的太棒了。

Substring Anagrams.png

网上有符合要求的代码,反正也只是简单难度。
我自己随便思考出来的方法似乎会超时,见求教各位,这题怎么搞?一贴。
总之就是由于无序而转为统计每个字符出现的个数并比较。
这个思路的C++11版代码,没测试是否超时

#include <iostream>
#include <vector>
#include <string>
#include <map>
using namespace std;


void func(string word, map<char, size_t>& count)
{
    for (size_t i = 0; i <= word.size(); ++i)
    {
        auto ret = count.insert({ word[i],1 });
        if (!ret.second)
            ++ret.first->second;
    }
}

int main() {
    //string s = "cbaebabacd";
    //string p = "abc";
    string s = "abab";
    string p = "ab";
    vector<int> vec;
    map<char, size_t> word_count2;
    func(p, word_count2);
    for (size_t i = 0; i<s.size() - p.size() + 1; ++i)
    {
        map<char, size_t> word_count1;
        func(s.substr(i, p.size()), word_count1);
        if (word_count1 == word_count2)
            cout << i;
            vec.push_back(i);
    }
    return 0;
}

这个思路的Python版代码,虽然测试确定会超时,毕竟Python性能差,胜在简洁

from collections import Counter
def func(s, p):
    return [i for i in range(len(s)-len(p)+1) if Counter(s[i:i+len(p)]) == Counter(p)]

s, p = "cbaebabacd", 'abc'
print(func(s, p))

问题出在哪呢,真的只是算法本身选的不好吗?
灯光说是字符串切片成本太高,改成前后连接比较好。代码就不再写了。贴吧也有已经AC的代码。

相关文章

网友评论

      本文标题:[LintCode] Substring Anagrams

      本文链接:https://www.haomeiwen.com/subject/jkojdxtx.html