2

1 つの文字列と文字列のセル配列があります。

str = 'actaz';
dic = {'aaccttzz', 'ac', 'zt', 'ctu', 'bdu', 'zac', 'zaz', 'aac'};

取得したい:

idx = [2, 3, 6, 8];

私は非常に長いコードを書きました:

  1. 長さが length(str) 以下の要素を検索します。
  2. str に含まれない文字を含む要素を削除します。
  3. 最後に、残りの要素ごとに、文字を 1 つずつチェックします

本質的に、これはほとんど力ずくのコードであり、非常にゆっくりと実行されます。速くする簡単な方法があるのだろうか。

NB: 質問を編集して、文字が str に n 回出現する場合、文字を n 回繰り返すことができることを明確にしました。シャイさん、ご指摘ありがとうございます。

4

2 に答える 2

1

私はこれを思いついた:

>> g=@(x,y) sum(x==y) <= sum(str==y); 
>> h=@(t)sum(arrayfun(@(x)g(t,x),t))==length(t);
>> f=cellfun(@(x)h(x),dic);
>> find(f)

ans =

     2     3     6
  • g & h: 検索文字列内の各文字のカウント数 <= のカウント数かどうかを確認しstrます。
  • f : 最後に、各要素に g と h を使用しますdic
于 2013-10-13T09:58:06.770 に答える
1

文字列を並べ替えてから、正規表現を使用して一致させることができます。あなたの例では、パターンは次のようになります^a{0,2}c{0,1}t{0,1}z{0,1}$

u = unique(str);
t = ['^' sprintf('%c{0,%d}', [u; histc(str,u)]) '$']; 
s = cellfun(@sort, dic, 'uni', 0);
idx = find(~cellfun('isempty', regexp(s, t)));
于 2013-10-13T15:32:50.640 に答える