例えば、s1='Kfbf'、s2='fbKK'としたときに、
s1とs2は、Kとfの数が違えど、同じ種類の文字で構成されています。
このように、2つの文字列が同じ種類の文字で構成されているかどうかを、
調べる関数を作りたいんです。
一応考えているアルゴリズムは、
s1[i]とs2を比べて、s1[i]の全てがs2の中に含まれているかどうか、
同様にs2[i]とs1を比べて、s2[i]の全てがs1に含まれているかどうか、
上の2つの条件を共に満たした場合、trueである
というものですが、他にいい方法があるでしょうか?
よろしくお願いします。
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;
なんてしてみたんですが、、、(泣)
ご提案の論理が一番はやいと思います。
そのほかに、s1+s2 の中にある文字の種類の数を調べて、それがおのおのの
s1 と s2 の中にある種類数と一致していることでも確かめられます。
解決しました。
通りすがりさん、りおりおさん、
どうも、ありがとうございました!!
アルファベット(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!');
> 集合型を使うやり方もあります。
おもしろいですね。二重に要素を加えることはできないことを利用しているのですね。
勉強になりました。
ツイート | ![]() |