質問編集履歴

1

質問内容の変更、コードの添付、タグ「アルゴリズム」の削除

2018/09/24 11:03

投稿

pifacela
pifacela

スコア19

test CHANGED
@@ -1 +1 @@
1
- 文字列を2つずつ比較して前後の重複部分を削除して組み合わせ」といプログラムはどようにけば良いですか?
1
+ ある文字列の最ともう一方文字列の最初が重複してかどかを調べられる正規表現の書き方
test CHANGED
@@ -2,59 +2,93 @@
2
2
 
3
3
 
4
4
 
5
- 文字列を2つずつ比較して前後で重なる部分があったら、一方の重複部分を削除、できた文字列同士組み合わせ
5
+ 下記のように、ある文字列の最初ともう一方の文字列の最後が重複しているかどうか調べられプログラムを書いたのですが、
6
6
 
7
- というプログラムをJavaを使って作成したいのですが、どのようなアルゴリズムで作ったらいいでしょうか?(Javaでなくとも構いません)
8
-
9
- また、ど方針やったが効率が良いですか
7
+ プログラムをより簡潔にきる正規表現の書きはありますか
10
-
11
- ex)あか+かい→あかい
12
8
 
13
9
 
14
10
 
15
- ### 発生している問題・エラーメッセージ
11
+ 例)文字1が"abcde"、文字2が"deabc"だった場合、文字1の最後の"de"と文字2の最初の"de"がそれぞれ同じなので、重複していると判定が出る。
16
12
 
13
+
14
+
15
+ ### 該当のソースコード
16
+
17
+
18
+
19
+ ```Java
20
+
21
+ String str1;
22
+
23
+ String str2;
24
+
25
+ StringBuilder str1Cpy = new StringBuilder(str1);
26
+
27
+ StringBuilder str2Cpy = new StringBuilder(str2);
28
+
29
+ boolean flagStr1 = false;
30
+
31
+ boolean flagStr2 = false;
32
+
33
+ Matcher m1 = null;
34
+
35
+ Matcher m2 = null;
36
+
37
+
38
+
39
+ for(int i=0;i<str1.length();i++) {
40
+
17
- コードを書いていて、あまりにも面倒くさい処理の量だったので、もう少し簡潔に書けないかなと調べましたが力尽きましたので質問させていただきます。ちなみに、以下の手順は考えただけで試してはいません。なので、これで正常に動作するかどうかは調べていません。ごめんなさい。
41
+ Pattern p = Pattern.compile("^" + str1Cpy.toString());
42
+
43
+ m1 = p.matcher(str2);
44
+
45
+ if(m1.find()) {
46
+
47
+ flagStr1 = true;
48
+
49
+ break;
50
+
51
+ }
52
+
53
+ str1Cpy.deleteCharAt(0);
54
+
55
+ }
56
+
57
+ for(int i=0;i<str2.length();i++) {
58
+
59
+ Pattern p = Pattern.compile(str2Cpy.toString() + "$");
60
+
61
+ m2 = p.matcher(str1);
62
+
63
+ if(m2.find()) {
64
+
65
+ flagStr2 = true;
66
+
67
+ break;
68
+
69
+ }
70
+
71
+ str2Cpy.deleteCharAt((str2Cpy.length()-1));
72
+
73
+ }
74
+
75
+
76
+
77
+ if(flagStr1 && flagStr2){
78
+
79
+ 何かの処理
80
+
81
+ }
82
+
83
+ ```
18
84
 
19
85
 
20
86
 
21
87
  ### 試したこと
22
88
 
23
- n個の文字に対して処理をする
24
-
25
- 以下の処理をn-1回繰り返す
26
89
 
27
90
 
28
-
29
- 文字1複製て文字ⅰを作る(ディープコピー)
91
+ 上記のように総当たり的な正規表現の使い方をしました。
30
-
31
- "^"+文字ⅰ(正規表現) 文字2の最初が文字ⅰかどうか調べる→文字ⅰの文字を前から一つ消去
32
-
33
- というのを文字1.length()回調べる
34
-
35
-
36
-
37
- 同様に、
38
-
39
- 文字2を複製して文字ⅱを作る(ディープコピー)
40
-
41
- "^"+文字ⅱ(正規表現) 文字1の最初が文字ⅱかどうか調べる→文字ⅱの文字を前から一つ消去
42
-
43
- というのを文字2.length()回調べる
44
-
45
-
46
-
47
- どちらもヒットしたら、
48
-
49
- 重なる部分文字列を取得して
50
-
51
- 文字2からその長さ分を前から削除し、
52
-
53
- 文字1と文字2を組み合わせる
54
-
55
- →文字1と文字2を合体させたものを文字1にする/文字2には、次の文字列を代入する
56
-
57
-
58
92
 
59
93
 
60
94