回答編集履歴

4

追記4

2019/11/25 00:55

投稿

takabosoft
takabosoft

スコア8356

test CHANGED
@@ -55,3 +55,41 @@
55
55
  追記3:
56
56
 
57
57
  あれ、もしかして"CABCAB"から"ABC"のオフセットを探すだけで答えになるんじゃ?
58
+
59
+
60
+
61
+ ----
62
+
63
+ 追記4:
64
+
65
+ 追記3のコードをPlaygroundで書いてみました。
66
+
67
+ 一応動いているようには見えます。
68
+
69
+
70
+
71
+ ```swift
72
+
73
+ import Foundation
74
+
75
+
76
+
77
+ let S1 = "ABCDE" // 期待値
78
+
79
+ let S2 = "DEABC" // ずらす前
80
+
81
+
82
+
83
+ let S2S2 = String(S2 + S2)
84
+
85
+ if let range = S2S2.range(of: S1) {
86
+
87
+ print(S2S2.distance(from: S2S2.startIndex, to: range.lowerBound)) //2
88
+
89
+ } else {
90
+
91
+ print("error")
92
+
93
+ }
94
+
95
+ ```

3

もしかして

2019/11/25 00:55

投稿

takabosoft
takabosoft

スコア8356

test CHANGED
@@ -47,3 +47,11 @@
47
47
 
48
48
 
49
49
  [https://medium.com/@notestomyself/string-rotation-in-swift-ab5b38721c56](https://medium.com/@notestomyself/string-rotation-in-swift-ab5b38721c56)
50
+
51
+
52
+
53
+ ----
54
+
55
+ 追記3:
56
+
57
+ あれ、もしかして"CABCAB"から"ABC"のオフセットを探すだけで答えになるんじゃ?

2

2019/11/25 00:40

投稿

takabosoft
takabosoft

スコア8356

test CHANGED
@@ -3,6 +3,8 @@
3
3
 
4
4
 
5
5
  ----
6
+
7
+ 追記1:
6
8
 
7
9
  Swiftの文字列操作は面倒くさいので、左に1回ずらす関数のサンプルを作ってみました。
8
10
 
@@ -33,3 +35,15 @@
33
35
 
34
36
 
35
37
  あとは躓くポイントは無さそうです。
38
+
39
+
40
+
41
+ ----
42
+
43
+ 追記2:
44
+
45
+ 使う必要があるかは判りませんが、ずらしていった結果、一致するかという判定は以下のページの手法使えば簡単にできそうですね。
46
+
47
+
48
+
49
+ [https://medium.com/@notestomyself/string-rotation-in-swift-ab5b38721c56](https://medium.com/@notestomyself/string-rotation-in-swift-ab5b38721c56)

1

文字列操作は面倒くさい

2019/11/25 00:37

投稿

takabosoft
takabosoft

スコア8356

test CHANGED
@@ -1 +1,35 @@
1
1
  一番ラクそうなのは、「一致するまで左にずらして、そのずらした回数をカウントアップする」、でしょうね。
2
+
3
+
4
+
5
+ ----
6
+
7
+ Swiftの文字列操作は面倒くさいので、左に1回ずらす関数のサンプルを作ってみました。
8
+
9
+
10
+
11
+ ```swift
12
+
13
+ extension String {
14
+
15
+ func rotateLeft() -> String {
16
+
17
+ return String(suffix(count - 1) + prefix(1))
18
+
19
+ }
20
+
21
+ }
22
+
23
+
24
+
25
+ let S2 = "CAB"
26
+
27
+ print(S2) // "CAB"
28
+
29
+ print(S2.rotateLeft()) // "ABC" ※結果は戻り値という点に注意
30
+
31
+ ```
32
+
33
+
34
+
35
+ あとは躓くポイントは無さそうです。