teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

3

追記

2017/11/21 06:47

投稿

mkgrei
mkgrei

スコア8562

answer CHANGED
@@ -42,4 +42,20 @@
42
42
 
43
43
  print(list_of_combs(input()))
44
44
  #['B', 'BA', 'BAN', 'BANA', 'BANAN', 'BANANA', 'A', 'AN', 'ANA', 'ANAN', 'ANANA', 'N', 'NA', 'NAN', 'NANA', 'A', 'AN', 'ANA', 'N', 'NA', 'A']
45
- ```
45
+ ```
46
+ ---
47
+ 以下チラ裏かもですが。
48
+ アルゴリズムに興味があるのかわからないのですが、全パターンを一度展開してしまうと、計算時間・計算メモリともに厳しいものがあります。
49
+ 計算時間としては[計算のオーダー](https://qiita.com/cotrpepe/items/1f4c38cc9d3e3a5f5e9c)が重要かと思います。
50
+
51
+ 0. 上の例で、`A***`を見たら直ちにそれは4を足せば良いと分かればオーダーは文字列の長さにかかわらず1となります。O(1)と表記します。
52
+ 0. それに対して`[A, A*, A**, A***]`と展開すると、文字列の長さM個だけ増えます。これはO(M)というやつです。
53
+
54
+ この外側に、上の問題の場合文字列の先頭を走査するのに、Sの長さN回行う必要があります。
55
+
56
+ 0. それぞれの部分文字列の数え上げがO(1)であれば、全体でO(N)、
57
+ 0. 部分文字列の数え上げがO(N)であれば、全部合わせて数え上げるのにO(N^2)の計算量がかかります。
58
+
59
+ 問題ではSの長さの上限が10^6でしたので、O(N)のアルゴリズムでは10^6回、O(N^2)のアルゴリズムでは10^12回演算が発生します。
60
+ 高性能なCPUでも4.5GHzなどなので一秒あたり10^9の演算しかできません。
61
+ 比較してみると前者のアルゴリズムでは1秒以内に終わるのに対して、後者のアルゴリズムでは数分かかります。

2

追記

2017/11/21 06:47

投稿

mkgrei
mkgrei

スコア8562

answer CHANGED
@@ -26,4 +26,20 @@
26
26
  else:
27
27
  for i in m:
28
28
  print(i[1:-1])
29
+ ```
30
+
31
+ ---
32
+ 後半は、ただの数え上げなので、正規表現を使わないかと。
33
+ 例えば、`A***`なら`[A, A*, A**, A***]`4種類を数え上げるだけなので。
34
+ どうしても全パターンを一度出力したいのならitertoolsのcombinationsを使えば良いです。
35
+
36
+ ```python
37
+ import itertools
38
+
39
+ def list_of_combs(s):
40
+ combs = [s[i:j] for i,j in itertools.combinations(list(range(len(s)))+[None], 2)]
41
+ return combs
42
+
43
+ print(list_of_combs(input()))
44
+ #['B', 'BA', 'BAN', 'BANA', 'BANAN', 'BANANA', 'A', 'AN', 'ANA', 'ANAN', 'ANANA', 'N', 'NA', 'NAN', 'NANA', 'A', 'AN', 'ANA', 'N', 'NA', 'A']
29
45
  ```

1

修正

2017/11/21 03:39

投稿

mkgrei
mkgrei

スコア8562

answer CHANGED
@@ -13,4 +13,17 @@
13
13
  else:
14
14
  for i in m:
15
15
  print(i[1:-1])
16
+ ```
17
+
18
+ こっちのほうが速いですね。
19
+ ```python
20
+ import re
21
+ s = input()
22
+ s = re.sub(r'[^aiueoAIUEO]{1,}', 'zz', s)
23
+ m = re.findall(r'[^aiueoAIUEO][aiueoAIUEO]{2,}[^aiueoAIUEO]', s)
24
+ if len(m) == 0:
25
+ print("-1")
26
+ else:
27
+ for i in m:
28
+ print(i[1:-1])
16
29
  ```