ある文字列に含まれる種類を調べるには?

解決


たーた  2005-01-22 12:39:00  No: 12814

例えば、s1='Kfbf'、s2='fbKK'としたときに、
s1とs2は、Kとfの数が違えど、同じ種類の文字で構成されています。
このように、2つの文字列が同じ種類の文字で構成されているかどうかを、
調べる関数を作りたいんです。

一応考えているアルゴリズムは、
s1[i]とs2を比べて、s1[i]の全てがs2の中に含まれているかどうか、
同様にs2[i]とs1を比べて、s2[i]の全てがs1に含まれているかどうか、
上の2つの条件を共に満たした場合、trueである
というものですが、他にいい方法があるでしょうか?
よろしくお願いします。


通りすがり  2005-01-22 16:51:08  No: 12815

function IsHoge(s1, s2: string): boolean;
var
  tmp: TStringList;
  i: Integer;
begin
  tmp := TStringList.Create;
  tmp.Sorted := True;
  tmp.Duplicates := dupIgnore;

  for i:=1 to Length(s1) do tmp.Add(s1[i]);
  s1 := tmp.Text;

  tmp.Clear;

  for i:=1 to Length(s2) do tmp.Add(s2[i]);
  s2 := tmp.Text;

  Result := (s1=s2);
  tmp.Free;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  s1, s2: string;
begin
  s1 := Edit1.Text;
  s2 := Edit2.Text;
  ShowMessage(BoolToStr(IsHoge(s1,s2),True));
end;
なんてしてみたんですが、、、(泣)


りおりお  2005-01-22 20:44:51  No: 12816

ご提案の論理が一番はやいと思います。
そのほかに、s1+s2 の中にある文字の種類の数を調べて、それがおのおのの
s1 と s2 の中にある種類数と一致していることでも確かめられます。


  2005-01-22 23:46:58  No: 12817

解決しました。
通りすがりさん、りおりおさん、
どうも、ありがとうございました!!


n  2005-01-23 00:40:03  No: 12818

アルファベット(1バイト文字)限定ですが集合型を使うやり方もあります。
type TCharSet = set of char;

// 文字列を文字の集合に変換
// 'Kfbf' -> ['K', 'b', 'f'] <- 'fbKK'
function StrToCharSet(s: String): TCharSet;
var i: Integer;
begin
  Result := [];
  for i := 1 to Length(s) do   Result := Result + [s[i]];
end;

if StrToCharSet('Kfbf') = StrToCharSet('fbKK') then
  ShowMessage('identical!');


りおりお  2005-01-23 05:47:27  No: 12819

> 集合型を使うやり方もあります。

おもしろいですね。二重に要素を加えることはできないことを利用しているのですね。
勉強になりました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加