JavaScriptで文字列から構築できる最長回文の長さを求める方法
問題の概要
小文字または大文字のアルファベットのみで構成された文字列 s が与えられたとき、これらの文字を使って構築できる最も長い回文の長さを返す必要があります。なお、大文字と小文字は区別されるため、たとえば「Aa」は回文として扱われません。
例
入力文字列が次の場合を考えてみましょう。
const str = "abccccdd";
このとき出力は 7 になります。これは、「dccaccd」という長さ7の回文をこれらの文字で構築できるためです。
解決のアプローチ
回文を構築するには、同じ文字がペア(2つ)で必要です。そこで、各文字の出現状況を追跡し、ペアが成立するたびに長さを2ずつ加算していきます。さらに、奇数個残った文字が1つでも存在すれば、それを回文の中央に配置できるため、最終的な長さに1を追加します。
ここでは JavaScript の Set オブジェクトを活用し、以下の手順で処理を行います。
- 文字列を先頭から順に走査する。
- その文字がすでにセット内に存在すれば、ペアが見つかったことを意味するため、カウントを2増やしてセットから削除する。
- 存在しなければ、その文字をセットに追加する。
走査完了後、セットに残っている文字は奇数回出現した文字です。1つでも残っていれば、それを回文の中心に置けるので、答えに1を足します。
コード例
const str = "abccccdd";
const longestPalindrome = (str) => {
const set = new Set();
let count = 0;
for (const char of str) {
if (set.has(char)) {
count += 2; set.delete(char);
}
else {
set.add(char);
}
}
return count + (set.size > 0 ? 1 : 0);
};
console.log(longestPalindrome(str));実行結果
コンソールには次のように出力されます。
7
計算量の目安
このアルゴリズムの時間計算量は O(n)(n は文字列の長さ)、空間計算量は O(k)(k は異なる文字の種類数、英字のみなら最大52種類)となり、非常に効率的です。
-
C++で文字列内の最も長い数値を検索する方法
問題の概要この問題では、文字と英字のみで構成される文字列 str が与えられます。私たちのタスクは、文字列内で最も桁数の多い数値を見つけることです。問題の詳細: 文字列内に含まれる連続した数字の並び(数値)の中から、最も桁数が大きいものを特定する必要があります。具体例で問題を理解しよう入力: str = code001tutorials34124point出力: 34124説明:この文字列に含まれる数値は以下の通りです。001 → 桁数 334124 → 桁数 5このうち最も桁数が多いのは「34124」であるため、これが答えとなります。解決アプローチこの問題に対するシンプルな解決策は、文字列を
-
C++で文字列の長さを求める方法:基本テクニックとstrlen()関数の使い方
C++における文字列とは、ヌル文字(\0)で終端される1次元の文字配列のことです。文字列の長さとは、このヌル文字より前に存在する文字数を指します。例えば、次のような文字列を考えてみましょう。char str[] = The sky is blue; 上記の文字列に含まれる文字数 = 15それでは、文字列の長さを求めるプログラムを見ていきましょう。例1:whileループを使って文字数をカウントする方法#include<iostream> using namespace std; int main() { char str[] = Apple; &n