解決後でアレなのですが、
「対象文字列をソートし、隣接する文字が同じ箇所があるかを調べる」のもアリかと。
C++ならラクショーなんですけどね...
C++
1 # include <iostream>
2 # include <string>
3 # include <algorithm>
4 # include <set>
5
6 // 重複があったらtrueを返す
7 // そのいち
8 bool is_dup_1 ( const std :: string & str ) {
9 // コピーを作ってソートする
10 std :: string copy = str ;
11 std :: sort ( copy . begin ( ) , copy . end ( ) ) ;
12 // 重複を取り除くことで文字列が短くなったらtrueを返す
13 return std :: unique ( copy . begin ( ) , copy . end ( ) ) != copy . end ( ) ;
14 }
15
16 // 重複があったらtrueを返す
17 // そのに
18 bool is_dup_2 ( const std :: string & str ) {
19 // 重複を許さない集合に詰め込んで、要素数が減ったら重複アリ
20 return std :: set < char > ( str . begin ( ) , str . end ( ) ) . size ( ) != str . size ( ) ;
21 }
22
23 // 重複があったらtrueを返す
24 // そのさん
25 bool is_dup_3 ( const std :: string & str ) {
26 // コピーを作ってソートする
27 std :: string copy = str ;
28 std :: sort ( copy . begin ( ) , copy . end ( ) ) ;
29 // 隣接する同じ要素が見つかったらtrueを返す
30 return std :: adjacent_find ( copy . begin ( ) , copy . end ( ) ) != copy . end ( ) ;
31 }
32
33 int main ( ) {
34 std :: cout << std :: boolalpha << is_dup_1 ( "abcdefg" ) << std :: endl ;
35 std :: cout << std :: boolalpha << is_dup_1 ( "abcdefd" ) << std :: endl ;
36 std :: cout << std :: boolalpha << is_dup_2 ( "abcdefg" ) << std :: endl ;
37 std :: cout << std :: boolalpha << is_dup_2 ( "abcdefd" ) << std :: endl ;
38 std :: cout << std :: boolalpha << is_dup_3 ( "abcdefg" ) << std :: endl ;
39 std :: cout << std :: boolalpha << is_dup_3 ( "abcdefd" ) << std :: endl ;
40 }