質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
標準入力

標準入力(stdin)は、プログラムが標準的に用いるデータ入力元。リダイレクトしない限り、プログラムを起動した端末のキーボードが標準入力になります。UNIX系OSやC言語に実装されて普及した概念ですが、他のOSや言語も含めた総称としても使われます。

標準出力

標準出力(stdout)は、プログラムが標準的に用いるデータ出力元。標準出力に書き込み要求を発行しすることにより、ディスプレイ装置にデータを表示することができます。UNIX系OSやC言語に実装されて普及した概念ですが、他のOSや言語も含めた総称としても使われます。

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

3回答

474閲覧

文字列操作のアルゴリズムが思いつかないので知恵をお貸しください

siorukuru

総合スコア15

標準入力

標準入力(stdin)は、プログラムが標準的に用いるデータ入力元。リダイレクトしない限り、プログラムを起動した端末のキーボードが標準入力になります。UNIX系OSやC言語に実装されて普及した概念ですが、他のOSや言語も含めた総称としても使われます。

標準出力

標準出力(stdout)は、プログラムが標準的に用いるデータ出力元。標準出力に書き込み要求を発行しすることにより、ディスプレイ装置にデータを表示することができます。UNIX系OSやC言語に実装されて普及した概念ですが、他のOSや言語も含めた総称としても使われます。

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2019/11/24 23:57

編集2019/11/25 01:03

どのように正解を導き出せば良いのかアルゴリズムがわかりません。

たとえば、標準入力で次の値が与えられるとします。

入力例1
5
ABCDE
DEABC

Swift

1let N = Int(readLine()!)! 2let S1 = readLine()! 3let S2 = readLine()!

このように、標準入力をまずは受け取ります。

Nは文字数、S1は揃えたい文字、S2は揃える前の文字です。

そして、S2を左に何回ずらせばS1と同じになるのかを出したいです。

上記の標準入力の場合は、2回です。

入力例2
3
ABC
CAB

出力
1

どうかよろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2019/11/25 00:16

>わりません 細かいですがこういう誤字はノイズとなって要件を伝える際の邪魔になりえます。 文章はしっかり書きましょう。
siorukuru

2019/11/25 01:04

修正しました。
guest

回答3

0

左にN回ずらすという操作は
ABCから左N文字取り、残りの文字列の末尾にくっつける操作
になるのかなと思います。

でしたら、

  1. n = 0
  2. S1の先頭1文字がS2の先頭からd文字目にあることを確認する (d>=nの整数)
  3. S2をd文字分左に操作した文字列S2′S1と比較し合致しない場合はn=dとして2
    合致したら、dを出力し終了

みたいな感じですかね

投稿2019/11/25 00:34

asm

総合スコア15147

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

siorukuru

2019/11/25 01:56

参考になりました。ありがとうございます。
guest

0

知恵ということでコードは示しません。考え方だけ。

  1. 繰り返し回数をゼロに
  2. S1 と S2 を比較 --> 一致していたら終わり
  3. 繰り返し回数が N 回に達していたら終わり
  4. 一致しなければ一番左側の文字をS2の文字列から削除 - A
  5. 削除した文字を A の文字列の一番右側につけた文字列を作成し S2 へセット
  6. 繰り返し回数をカウントアップ
  7. 2番目〜ここまでの処理を繰り返す

投稿2019/11/25 00:21

ironya

総合スコア454

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ironya

2019/11/25 00:51

ベタすぎですな。。。反省
siorukuru

2019/11/25 01:56

とても参考になりました。ありがとうございます。
guest

0

ベストアンサー

一番ラクそうなのは、「一致するまで左にずらして、そのずらした回数をカウントアップする」、でしょうね。


追記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}

投稿2019/11/25 00:13

編集2019/11/25 00:55
takabosoft

総合スコア8356

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ironya

2019/11/25 00:49 編集

追記2のリンク先の方法良いですね。 追記3は追記2そのものですね。
takabosoft

2019/11/25 00:51

追記2は判定しているだけで、回転回数は出していないので、そこは出さないといけないです。
siorukuru

2019/11/25 01:58

うまくいきました。とても参考になる解答ありがとうございます!
takabosoft

2019/11/25 01:59

???? 私も頭の体操になりました。
ironya

2019/11/25 04:15

> 回転回数は出していないので、そこは出さないといけないです。 仰せのとおりです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問