JavaScriptで文字列から1文字を削除するだけで別の文字列と一致するかどうかを確認する
今回は、str1 と str2 という2つの文字列を引数として受け取るJavaScript関数を作成します。
この関数は、str1 からちょうど1文字だけを削除することで str2 を作れるかどうかを判定します。条件を満たせる場合は true を返し、そうでなければ false を返します。
入力例
たとえば、入力として次のような文字列が与えられたとします。
const str1 = 'chemistty'; const str2 = 'chemisty';
str1 の「t」を1つ削除すれば str2 と一致するため、期待される出力は次のようになります。
const output = true;
コード例
以下が実際のコードです。
const str1 = 'chemistty';
const str2 = 'chemisty';
const stringSimilarity = (str1 = '', str2 = '') => {
if(str1.length - str2.length !== 1){
return false;
};
for(let i = 0; i < str1.length; i++){
const desired = str1.substring(0, i) + str1.substring(i + 1, str1.length);
if(desired === str2){
return true;
};
};
return false;
};
console.log(stringSimilarity(str1, str2));出力結果
コンソールには以下のように出力されます。
true
処理の流れを解説
この関数のロジックはシンプルで、大きく分けて2段階になっています。
1. 文字数の事前チェック
まず、str1.length - str2.length !== 1 という条件で、両者の長さの差がちょうど1文字であることを確認しています。差が1でなければ、1文字の削除では絶対に一致しないため、その時点で false を返して無駄なループ処理を回避できます。
2. 各位置の文字を削除して比較
続いてfor文で各インデックス i を順に調べます。substring() を使って i 番目の文字だけを取り除いた文字列を組み立て、それが str2 と完全に一致するかどうかを比較します。
str1.substring(0, i): 先頭から i 番目まで(i 番目は含まない)の部分文字列str1.substring(i + 1, str1.length): i+1 番目以降の部分文字列
この2つを連結することで、「i 番目の1文字を削除した文字列」が得られます。一致が見つかれば即座に true を返し、最後まで見つからなければ false を返します。
計算量について
文字列の長さを n とすると、各位置での substring 生成・比較に O(n) かかるため、全体の計算量は O(n²) となります。日常的な用途では十分高速ですが、非常に長い文字列を扱う場合は、先頭から共通部分の長さを求めるなどの最適化も検討するとよいでしょう。
-
JavaScriptである関数から別の関数へイベントオブジェクトを渡す方法
JavaScriptでは、イベントハンドラ内で取得したイベントオブジェクトを、そのまま引数として別の関数へ渡すことができます。イベントオブジェクトには発生元の要素(event.target)やイベントの種類などの情報が含まれているため、複数の関数で同じイベント情報を共有したい場合にとても便利です。以下は、クリックイベントのイベントオブジェクトを受け渡し、ボタンのフォントサイズと文字色を変更するサンプルコードです。サンプルコード<!DOCTYPE html> <html lang="en"> <head> <meta charset=
-
JavaScriptでチェックボックスにチェックを入れる方法|checkedプロパティの使い方
Webフォームを作成していると、「ページを開いた時点で特定のチェックボックスにチェックを入れた状態にしたい」というケースがあります。JavaScriptでは、checkedプロパティを使うことで、これをとても簡単に実現できます。本記事では、具体的なコード例とともにその使い方をわかりやすく解説します。 サンプルで使うチェックボックス 今回は、以下のような2つのチェックボックスを例に説明します。 <label>John</label> <input id="checkedValue1" type="checkbox">