Javaで文字列を2文字分回転すると別の文字列と一致するかどうかを判定する方法
2つの文字列 a と b が与えられ、文字列 a を時計回りまたは反時計回りにちょうど2文字分回転させることで、文字列 b を作り出せるかどうかを判定するのが本記事のテーマです。まずは、具体的な入力例と出力例から確認していきましょう。
入力例と出力例
例1:回転によって一致する場合
入力:
a = google b = legoog
出力:
True
解説:文字列「google」を時計回り(右方向)に2文字分回転させると「legoog」になります。したがって、True を返します。
例2:回転では一致しない場合
入力:
a = tuorialst b = tutorials
出力:
False
解説:文字列「tuorialst」をどちらの方向に2文字分回転させても「tutorials」にはなりません。したがって、False を返します。
この問題を解くためのアプローチ
与えられた2つの文字列に対して、このアプローチでは次の2つの場合について検証を行います。
反時計回り(左回転)の場合
時計回り(右回転)の場合
まず、両者の文字列長が異なる場合は回転しても一致しないため false を返します。また、文字列の長さが「2」以下の場合は、回転しても並び順が変わらないため true を返します。
それ以外の場合は、次のように判定します。
文字列 b を反時計回りに2文字分回転した結果が文字列 a と一致すれば、true を返します。
文字列 b を時計回りに2文字分回転した結果が文字列 a と一致すれば、true を返します。
どちらでも一致しなければ、false を返します。
アルゴリズムの手順
- 2つの入力文字列 a と b を受け取ります。
- ブール値を返す関数 checkRotated(String a, String b) を用意し、文字列 b を反時計回りまたは時計回りに2文字分回転した結果が文字列 a と一致するかどうかを判定します。
- 文字列 a と文字列 b の長さを比較し、異なる場合は false を返します。
- 文字列 b を反時計回りに2文字分回転した文字列を生成します。
- 生成した結果が文字列 a と等しいかどうかを確認し、等しければ true を返します。
- 続いて、文字列 b を時計回りに2文字分回転した文字列を生成します。
- 生成した結果が文字列 a と等しいかどうかを確認し、等しければ true を返します。
- どちらとも一致しない場合は、false を返します。
実装例(Java)
public class Solution{
static boolean checkRotated(String str1, String str2){
int len = str2.length();
// 文字列長が異なる場合は回転しても一致しない
if (str1.length() != len)
return false;
// 長さが2以下の場合は回転しても同じ文字列になる
if (len <= 2)
return true;
// 時計回り:末尾の2文字を先頭へ移動
String clockwise = str2.substring(len - 2) + str2.substring(0, len - 2);
// 反時計回り:先頭の2文字を末尾へ移動
String anticlockwise = str2.substring(2) + str2.substring(0, 2);
return (str1.equals(clockwise) || str1.equals(anticlockwise));
}
public static void main(String[] args){
String s1 = "google";
String s2 = "legoog";
System.out.println(checkRotated(s1, s2) ? "True" : "False");
}
}
出力
上記のコードを実行すると、コンソールには次のように表示されます。
True
これは、文字列「google」を時計回りに2文字分回転させると「legoog」と一致するためです。関数 checkRotated の判定結果が true となるため、プログラムは「True」を出力します。
-
【Python】1文字を削除して別の文字列に変換できるか判定する方法
2つの文字列 s と t が与えられたとき、s から1文字だけ削除することで t と同じ文字列を作れるかどうかを判定する問題について解説します。問題の例たとえば、入力が以下の場合を考えてみましょう。s = worldt = wrldこの場合、world から「o」を1文字削除すると wrld になるため、出力は True となります。解決のアプローチこの問題は、次の手順で解くことができます。インデックス i を 0 で初期化し、文字列 s の長さを n として取得します。i が n 未満である間、以下を繰り返します。s の i 番目の文字を取り除いた文字列(前半部分と後半部分を連結)を tem
-
Pythonで文字列同士を1対1にマッピングできるか判定するプログラムの書き方
問題の概要 2つの小文字からなる文字列 s と t が与えられたとします。このとき、s 内の各文字を別の文字(同じ文字でも可)へ1対1対応でマッピングすることで、s を t に変換できるかどうかを判定するのが本記事のテーマです。なお、文字の並び順は変更しないものとします。 例えば、入力が s = papa、t = lili の場合、出力は True になります。これは「p → l」「a → i」というマッピングを作成できるためです。 逆に、同じ文字が異なる文字にマッピングされようとした場合(例えば「p」が一度「l」に対応したのに、後で「m」に対応しようとする場合)や、異なる文字が同じ文字に重複