792. 部分列に一致する単語の数
中くらい
282
関連事業
文字列 s
と文字列の配列 を指定するとwords
、 words[i]
iss
のサブシーケンス内の単語の数を返します 。
文字列の サブシーケンス は、元の文字列から生成された新しい文字列であり、残りの文字の相対的な順序を変更せずに、一部の文字 (文字がない場合もあります) を削除できます。
- たとえば、 は のサブシーケンス
“ace”
です 。“abcde”
例 1:
入力: s = "abcde"、words = ["a","bb","acd","ace"] 出力: 3 説明: s の部分列である 3 つの単語があります: "a"、"acd"、 "エース"。
例 2:
入力: s = "dsahjpjauf"、words = ["ahjpjau","ja","ahbwzgqnuk","tnmlanowax"] 出力: 2
ヒント:
1 <= s.length <= 5 * 104
1 <= words.length <= 5000
1 <= words[i].length <= 50
words[i]
sと s はどちらも 小文字のみで構成されます。
パス
23.7K
提出物
47.5K
合格率
49.9%
問題の解決策: 2 つの文字列 s と t を比較します。そのうちの 1 つは別の部分文字列の問題ですが、ダブル ポインターを使用して一度に調べることができます。次に、この質問は for ループの層を外側に追加するというもので、すべての文字列配列を走査するだけで十分です。それで送信したところ、タイムアウトになったことがわかりました。。。。タイムアウトが経過したので、繰り返される操作の一部を削除するようにアルゴリズムを最適化する必要があります。タイムアウトのテストケースを見ていて、テスト文字列の多くが繰り返し使われているので、ハッシュテーブルを追加して重複を削除し、再びハッシュテーブルを通過できるようにしました。具体的にコードを見ると、table[26] の使用は不一致を早期に終了するために使用される最適化です。
class Solution {
public:
int numMatchingSubseq(string s, vector<string>& words) {
int sum=0;
int table[26]={0};
unordered_map<string,int> Hashmap;
for(auto ch:s)
{
table[ch-'a']++;
}
for(auto str:words)
{
Hashmap[str]++;
}
for(auto p:Hashmap)
{
string temStr=p.first;
int k=0;
int sk=0;
// 计算是否存在
bool flag=true;
int temptable[26]={0};
for(auto i:temStr)
{
temptable[i-'a']++;
if(temptable[i-'a']>table[i-'a'])
{
flag=false;
break;
}
}
if(flag)
{
while(k<temStr.size() && sk<s.size())
{
if(temStr[k]==s[sk])
{
k++;
sk++;
}
else
{
sk++;
}
}
if(k>temStr.size()-1)
{
sum+=p.second;
}
}
}
return sum;
}
};
時間 168ms
ビート
63.30%
RAM42.1MB
ビート
74.64%