JavaScriptで2つの文字列に共通しない文字を抽出して返す方法
問題
2つの文字列を引数として受け取るJavaScript関数を作成することを考えます。この関数は、両方の文字列に共通して含まれていない文字、つまりどちらか一方の文字列にのみ存在する文字だけを抜き出し、それらをつなげた新しい文字列を返す必要があります。
たとえば、"xyab" と "xzca" の2つの文字列が与えられた場合、共通する文字は x と a なので、結果として y、b、z、c を連結した "ybzc" を返すことになります。
コード例
以下がその実装コードです。
const str1 = "xyab";
const str2 = "xzca";
const findUncommon = (str1 = '', str2 = '') => {
const res = [];
// str1側の文字をチェック
for (let i = 0; i < str1.length; i++){
if (!(str2.includes(str1[i]))){
res.push(str1[i]);
}
}
// str2側の文字をチェック
for (let i = 0; i < str2.length; i++){
if (!(str1.includes(str2[i]))){
res.push(str2[i]);
}
}
return res.join("");
};
console.log(findUncommon(str1, str2));出力結果
ybzc
コードの解説
このアプローチのポイントは以下の通りです。
- 第1ループ: 文字列
str1の各文字について、str2.includes()を使って相手側に同じ文字が存在するかどうかを確認します。存在しなければ結果配列に追加します。 - 第2ループ: 同様に、文字列
str2の各文字がstr1に存在しない場合に結果配列へ追加します。 - 最終処理:
join("")によって配列内の文字を1つの文字列として連結し、返却します。
上記の例では、"xyab" のうち str2 に含まれないのは y と b、"xzca" のうち str1 に含まれないのは z と c であるため、出力は "ybzc" となります。
より簡潔に書くなら
filter() メソッドを活用すれば、同じ処理をもっと短く表現できます。
const findUncommon = (str1 = '', str2 = '') =>
[...str1].filter(c => !str2.includes(c))
.concat([...str2].filter(c => !str1.includes(c)))
.join('');また、文字数が多い場合には Set を使うことで、includes() の線形探索(O(n))を高速な参照(O(1))に置き換えられ、パフォーマンスが向上します。
-
C++で2つの文字列に共通する文字ペアを数える方法
本記事では、2つの文字列(str1とstr2)が与えられたときに、両者に共通する文字のペア数を求める方法を解説します。具体的には、str1[i] == str2[j]となる組み合わせを「一致するペア」とみなし、該当するたびにカウントを1ずつ増やしていきます。逆にstr1[i] != str2[j]の場合はペアとして扱われず、カウントも増加しません。 実行例 入力 − str1 = hello str2 = heoo出力 − count is: 3 説明: str1[0] = str2[0](h)、str1[1] = str2[1](e)は一致しており、str1[2] != str2[2]
-
【C++】2つの文字列を比較して共通しない文字を抽出するプログラム
この記事では、2つの異なる文字列を比較した際に、共通しない文字(どちらか一方にしか存在しない文字)を見つけ出すプログラムについて解説します。 ご存知の通り、文字列とは本質的に文字の配列です。そのため、比較を行う際は、一方の文字列の文字を先頭から順に走査しながら、その文字がもう一方の文字列にも存在するかどうかを確認していきます。 ここで、最初の文字列をA、2番目の文字列をBとすると、まず「A − B」(Aには含まれるがBには含まれない文字)が求められます。同様の手順で「B − A」も計算できます。 この2つの結果を組み合わせると、次の式になります。 ( A − B ) ∪ ( B − A )