C++で2つの文字列の違い(追加された1文字)を見つける方法
問題の概要
小文字の英字のみで構成された2つの文字列 s と t が与えられます。文字列 t は、s をランダムにシャッフルした後、ランダムな位置にさらに1文字を追加して生成されたものです。このとき、t に追加されたその1文字を見つけることが課題となります。
例えば、入力が "mnopq" と "pqmnot" の場合、出力は "t" になります。これが追加された余分な文字です。
解法のアプローチ:文字コードの合計値を利用する
この問題を効率的に解くには、各文字のASCIIコード(文字コード)の合計値を利用する方法が有効です。考え方は以下の通りです。
- 変数
sSumとtSumを0で初期化します。 - 文字列 s の各文字のASCIIコードを順番に加算し、
sSumを求めます。 - 同様に、文字列 t の各文字のASCIIコードを加算し、
tSumを求めます。 tSum - sSumの差分こそが追加された文字のコード値となるため、それをchar型にキャストして返します。
シャッフルによって文字の並び順は変わっても、含まれる文字自体は同じであるため、合計値の差は必ず追加された1文字分だけになります。計算量はO(n)と非常に効率的です。
C++での実装例
理解を深めるために、以下の実装例をご覧ください。
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
char findTheDifference(string s, string t) {
int sSum = 0;
int tSum = 0;
for (int i = 0; i < s.length(); i++) {
sSum += s[i];
}
for (int j = 0; j < t.length(); j++) {
tSum += t[j];
}
return char(tSum - sSum);
}
};
main(){
Solution ob;
cout << (ob.findTheDifference("mnopq","pqmnot"));
}入力
"mnopq","pqmnot"
出力
t
補足:XORを使った別の解法
文字コードの合計値以外にも、ビット演算のXOR(排他的論理和)を利用する方法があります。同じ文字同士をXORすると0になる性質を利用すれば、sとtの全文字をXORしていき、最後に残った値が追加された文字となります。オーバーフローを気にせずに済むため、こちらもよく使われる手法です。
-
C++で三角形の重心を求めるプログラムの作成方法
この記事では、三角形の3つの頂点の座標を格納した2次元配列が与えられたときに、その三角形の重心を求めるC++プログラムの作成方法を解説します。 三角形の重心とは、三角形の3本の中線がすべて交わる点のことです。 また、三角形の中線とは、ある頂点と、その対辺(向かい合う辺)の中点を結ぶ線分のことを指します。 それでは、具体的な例を使って問題を確認してみましょう。 入力 (-3, 1), (1.5, 0), (-3, -4) 出力 (-1.5, -1) 説明 重心 (x, y) = ((-3 + 1.5 - 3) / 3, (1 + 0 - 4) / 3) = (-1.5, -1) 解法のアプロ
-
C++で平行四辺形の面積を求めるプログラムの作成方法
この記事では、平行四辺形の底辺と高さを表す2つの値が与えられたとき、C++を使ってその面積を求めるプログラムを作成する方法を解説します。 平行四辺形とは? 平行四辺形とは、4つの辺からなる閉じた図形であり、向かい合う2組の辺がそれぞれ長さが等しく、互いに平行になっている四角形のことです。 問題を理解するための具体例 入力 B = 20, H = 15 出力 300 説明 平行四辺形の面積 = 底辺 × 高さ = 20 × 15 = 300 解決アプローチ この問題を解くには、平行四辺形の面積を求める幾何学の公式を使用します。 面積 = 底辺 × 高さ つまり、与えられた底辺と高さを掛け合わせ