質問編集履歴

1

修正後のコードを追加

2020/06/20 17:44

投稿

shake9
shake9

スコア19

test CHANGED
File without changes
test CHANGED
@@ -123,3 +123,137 @@
123
123
  ただ、A→C→Bの順となる可能性もあるので、その両方を比較する方法を試しました。
124
124
 
125
125
  しかし実行速度はほとんど同じでした。
126
+
127
+
128
+
129
+ ### 修正後のコード
130
+
131
+ ```Python
132
+
133
+ a = input()
134
+
135
+ b = input()
136
+
137
+ c = input()
138
+
139
+
140
+
141
+ aa = len(a)
142
+
143
+ bb = len(b)
144
+
145
+ cc = len(c)
146
+
147
+
148
+
149
+ lensum = aa + bb + cc # 文字列の長さの最大値
150
+
151
+ ab = [0]*(lensum+cc+1) # 相対的位置に対して合わさるかどうかを記録
152
+
153
+ ac = [0]*(lensum+bb+1)
154
+
155
+ bc = [0]*(lensum+aa+1)
156
+
157
+
158
+
159
+ def match(v,w): # 2つの文字を合わせられるかどうかを調べる
160
+
161
+ if(v != '?' and w != '?' and v != w):
162
+
163
+ return 0
164
+
165
+ else:
166
+
167
+ return 1
168
+
169
+
170
+
171
+ def match2(A,B,k): # 2つの文字列とその相対的位置に対して合わさるかチェック
172
+
173
+ AA = len(A)
174
+
175
+ BB = len(B)
176
+
177
+ if(k>=AA):
178
+
179
+ return 1
180
+
181
+ elif(k<-BB):
182
+
183
+ return 1
184
+
185
+ else:
186
+
187
+ flg = 1
188
+
189
+ st = max(0,k)
190
+
191
+ la = min(AA,BB+k)
192
+
193
+ for i in range(st,la):
194
+
195
+ if(match(A[i],B[i-k])==0):
196
+
197
+ flg = 0
198
+
199
+ break
200
+
201
+ return flg
202
+
203
+
204
+
205
+ #ab,ac,bcに対して計算する
206
+
207
+ for i in range(lensum+cc+1):
208
+
209
+ ab[i] = match2(a,b,i-bb-cc)
210
+
211
+ for i in range(lensum+bb+1):
212
+
213
+ ac[i] = match2(a,c,i-bb-cc)
214
+
215
+ for i in range(lensum+aa+1):
216
+
217
+ bc[i] = match2(b,c,i-aa-cc)
218
+
219
+
220
+
221
+ def milen(a,b,c):
222
+
223
+ minlen = lensum # 文字列の長さの最大値
224
+
225
+ for i in range(-bb-cc,aa+cc+1): # iが文字列Bの開始位置
226
+
227
+ for j in range(-bb-cc,aa+bb+1): # jが文字列Cの開始位置
228
+
229
+ if(ab[i+bb+cc] == 0):
230
+
231
+ continue
232
+
233
+ elif(ac[j+bb+cc] == 0):
234
+
235
+ continue
236
+
237
+ elif(j-i+aa+cc < 0 or j-i+aa+cc >= lensum+aa+1): #BとCが離れすぎている場合を除く
238
+
239
+ continue
240
+
241
+ elif(bc[j-i+aa+cc] == 0):
242
+
243
+ continue
244
+
245
+ else:
246
+
247
+ sta = min(0,i,j) #文字列の中で一番左にある開始位置
248
+
249
+ en = max(aa,i+bb,j+cc) #文字列の中で一番右にある終了位置
250
+
251
+ minlen = min(minlen,en-sta) #更新
252
+
253
+ return minlen
254
+
255
+
256
+
257
+ print(milen(a,b,c))
258
+
259
+ ```