438【leetcode】は、文字列のすべてのアナグラムを探します

トピック説明

438は、異所性すべてのアルファベット単語列を検索し
、文字列sと非空の文字列pを考えると、すべての単語が異所性s内の文字pのサブで見つけ、部分文字列の開始インデックスを返します。

文字列が小文字のみが含まれており、文字列の長さp、sは20100以上ではありません。

ソリューション1

アイデア:スライディングウィンドウ。文字列要素の数とは、配列に格納されています。新しいウィンドウが1に添加プラス文字の数、ウィンドウ内の文字の数マイナス1が除去されたときにスライディングウィンドウ、スライディングウィンドウの同じ長さの非空の文字列を維持します。2つの配列(文字列配列と標的配列のウィンドウ)を比較することによって判断する異所性ワードです。
時間複雑:O(n)は、

vector<int> findAnagrams(string s, string p) {
  vector<int> vret;
  if (s.size() < p.size())
    return vret;

  vector<int> vm(26);
  vector<int> vn(26);
  for (int i = 0; i < p.size(); i ++)
  {
    vm[p[i] - 'a'] ++;
    vn[s[i] - 'a'] ++;
  }

  int l = 0, r = p.size() - 1;

  while(r < s.size())
  {
    if (vm == vn)
    {
      vret.push_back(l);
    }

    if (r + 1 < s.size())
    {
      vn[s[r + 1] - 'a'] ++;
      vn[s[l] - 'a'] --;
      l ++;
      r ++;
    }
    else
      break;
  }
  return vret;
}

おすすめ

転載: www.cnblogs.com/JesseTsou/p/11334127.html