回答編集履歴

3

追記

2017/11/21 06:47

投稿

mkgrei
mkgrei

スコア8560

test CHANGED
@@ -87,3 +87,35 @@
87
87
  #['B', 'BA', 'BAN', 'BANA', 'BANAN', 'BANANA', 'A', 'AN', 'ANA', 'ANAN', 'ANANA', 'N', 'NA', 'NAN', 'NANA', 'A', 'AN', 'ANA', 'N', 'NA', 'A']
88
88
 
89
89
  ```
90
+
91
+ ---
92
+
93
+ 以下チラ裏かもですが。
94
+
95
+ アルゴリズムに興味があるのかわからないのですが、全パターンを一度展開してしまうと、計算時間・計算メモリともに厳しいものがあります。
96
+
97
+ 計算時間としては[計算のオーダー](https://qiita.com/cotrpepe/items/1f4c38cc9d3e3a5f5e9c)が重要かと思います。
98
+
99
+
100
+
101
+ 0. 上の例で、`A***`を見たら直ちにそれは4を足せば良いと分かればオーダーは文字列の長さにかかわらず1となります。O(1)と表記します。
102
+
103
+ 0. それに対して`[A, A*, A**, A***]`と展開すると、文字列の長さM個だけ増えます。これはO(M)というやつです。
104
+
105
+
106
+
107
+ この外側に、上の問題の場合文字列の先頭を走査するのに、Sの長さN回行う必要があります。
108
+
109
+
110
+
111
+ 0. それぞれの部分文字列の数え上げがO(1)であれば、全体でO(N)、
112
+
113
+ 0. 部分文字列の数え上げがO(N)であれば、全部合わせて数え上げるのにO(N^2)の計算量がかかります。
114
+
115
+
116
+
117
+ 問題ではSの長さの上限が10^6でしたので、O(N)のアルゴリズムでは10^6回、O(N^2)のアルゴリズムでは10^12回演算が発生します。
118
+
119
+ 高性能なCPUでも4.5GHzなどなので一秒あたり10^9の演算しかできません。
120
+
121
+ 比較してみると前者のアルゴリズムでは1秒以内に終わるのに対して、後者のアルゴリズムでは数分かかります。

2

追記

2017/11/21 06:47

投稿

mkgrei
mkgrei

スコア8560

test CHANGED
@@ -55,3 +55,35 @@
55
55
  print(i[1:-1])
56
56
 
57
57
  ```
58
+
59
+
60
+
61
+ ---
62
+
63
+ 後半は、ただの数え上げなので、正規表現を使わないかと。
64
+
65
+ 例えば、`A***`なら`[A, A*, A**, A***]`4種類を数え上げるだけなので。
66
+
67
+ どうしても全パターンを一度出力したいのならitertoolsのcombinationsを使えば良いです。
68
+
69
+
70
+
71
+ ```python
72
+
73
+ import itertools
74
+
75
+
76
+
77
+ def list_of_combs(s):
78
+
79
+ combs = [s[i:j] for i,j in itertools.combinations(list(range(len(s)))+[None], 2)]
80
+
81
+ return combs
82
+
83
+
84
+
85
+ print(list_of_combs(input()))
86
+
87
+ #['B', 'BA', 'BAN', 'BANA', 'BANAN', 'BANANA', 'A', 'AN', 'ANA', 'ANAN', 'ANANA', 'N', 'NA', 'NAN', 'NANA', 'A', 'AN', 'ANA', 'N', 'NA', 'A']
88
+
89
+ ```

1

修正

2017/11/21 03:39

投稿

mkgrei
mkgrei

スコア8560

test CHANGED
@@ -29,3 +29,29 @@
29
29
  print(i[1:-1])
30
30
 
31
31
  ```
32
+
33
+
34
+
35
+ こっちのほうが速いですね。
36
+
37
+ ```python
38
+
39
+ import re
40
+
41
+ s = input()
42
+
43
+ s = re.sub(r'[^aiueoAIUEO]{1,}', 'zz', s)
44
+
45
+ m = re.findall(r'[^aiueoAIUEO][aiueoAIUEO]{2,}[^aiueoAIUEO]', s)
46
+
47
+ if len(m) == 0:
48
+
49
+ print("-1")
50
+
51
+ else:
52
+
53
+ for i in m:
54
+
55
+ print(i[1:-1])
56
+
57
+ ```