質問編集履歴
1
質問内容の変更、コードの添付、タグ「アルゴリズム」の削除
test
CHANGED
@@ -1 +1 @@
|
|
1
|
-
|
1
|
+
ある文字列の最後ともう一方の文字列の最初が重複しているかどうかを調べられる正規表現の書き方
|
test
CHANGED
@@ -2,59 +2,93 @@
|
|
2
2
|
|
3
3
|
|
4
4
|
|
5
|
-
文字列
|
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
|
-
|
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
|
|