一番ラクそうなのは、「一致するまで左にずらして、そのずらした回数をカウントアップする」、でしょうね。
追記1:
Swiftの文字列操作は面倒くさいので、左に1回ずらす関数のサンプルを作ってみました。
swift
1extension String {
2 func rotateLeft() -> String {
3 return String(suffix(count - 1) + prefix(1))
4 }
5}
6
7let S2 = "CAB"
8print(S2) // "CAB"
9print(S2.rotateLeft()) // "ABC" ※結果は戻り値という点に注意
あとは躓くポイントは無さそうです。
追記2:
使う必要があるかは判りませんが、ずらしていった結果、一致するかという判定は以下のページの手法使えば簡単にできそうですね。
https://medium.com/@notestomyself/string-rotation-in-swift-ab5b38721c56
追記3:
あれ、もしかして"CABCAB"から"ABC"のオフセットを探すだけで答えになるんじゃ?
追記4:
追記3のコードをPlaygroundで書いてみました。
一応動いているようには見えます。
swift
1import Foundation
2
3let S1 = "ABCDE" // 期待値
4let S2 = "DEABC" // ずらす前
5
6let S2S2 = String(S2 + S2)
7if let range = S2S2.range(of: S1) {
8 print(S2S2.distance(from: S2S2.startIndex, to: range.lowerBound)) //2
9} else {
10 print("error")
11}