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

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

新規登録して質問してみよう
ただいま回答率
85.48%
アルゴリズム

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

Q&A

解決済

8回答

3995閲覧

二つを入れ替える置換

kotet

総合スコア19

アルゴリズム

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

0グッド

4クリップ

投稿2015/07/23 09:11

文字列中の2文字を、入れ替えるように同時に置換したいです。
例えば”AABCCC”という文字列があり、その中のAとCを置換すると"CCBAAA"となります。
思いついた方法として、Aを適当な文字Dに置換し、CをAに置換し、最後にDをAに置換するというものです。しかし、この方法はDが文字列中に入っていたり、Dを置換したい場合使えません。仮文字を使わない方法がいいです。しかしどんな方法が適しているかわかりません。どんな方法が良いでしょうか?言葉ででもコードででもいいので、あなたが思いついた方法を教えてください。
よろしくお願いします。

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

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

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

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

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

guest

回答8

0

Rubyでいいなら、String#tr使えばいいだけだった。

Ruby

1"AABCCC".tr("AC", "CA") # => "CCBAAA"

投稿2015/07/23 09:45

raccy

総合スコア21735

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

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

kotet

2015/07/23 12:07

Rubyにはそんなピッタリなメソッドがあるんですか!自分はRubyを使った事がないのですが、使う時のために覚えておきたいと思います。
guest

0

ベストアンサー

C言語のように配列アクセス可能なプログラミング言語ならば簡単です.

c

1void exchange(char *str, int len, char a, char b) 2{ 3 int i; 4 for (i = 0; i < len; i++) { 5 if (str[i] == a) 6 str[i] = b; 7 else if (str[i] == b) 8 str[i] = a; 9 } 10}

ただし,配列アクセスをしないものだと,困難かもしれません.
僕も,一度別の文字Dを使う方法しか思いつきません.

投稿2015/07/23 09:27

KenTerada

総合スコア751

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

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

kotet

2015/07/23 12:01 編集

一文字づつ処理するという考えがすっかり抜けていました。一度考えにとらわれてしまうとなかなか気づけないものですね…… 他の方も上げられているように、1文字づつでやろうと思います。ありがとうございました。
guest

0

要するに下記の2つの置換を行なうとき、2パスで処理するとうまくいかないということです。

A -> C C -> A

これは、2つの文字の入れ替えだけでなく、例えば次のような置換を行いたい場合でも発生する問題です。

A -> B B -> C

(このケースなら2パスの順番を入れ替えるだけでも大丈夫ですが)

raccy さんや mie さんが回答しているように、1文字ずつ、2つの置換を同時に行なう必要があります。

投稿2015/07/23 10:00

ngyuki

総合スコア4514

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

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

0

echo "AAABCCC" | sed 's/(AAA)(.*)(CCC)/\3\2\1/'

コマンドで簡単に。

投稿2015/07/23 09:32

moonphase

総合スコア6621

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

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

0

置換したい文字のインデックスを取得するというのはどうでしょう?

AABCCCにおいて
A[0, 1]番目
C[3, 4, 5]番目
このように置換したい文字のインデックスを取得しておいて、
[0, 1]番目の文字をCに置き換え、[3, 4, 5]番目の文字をAに置き換えれば、CCBAAAになるのではないでしょうか?
分かりづらかったらすいません。

投稿2015/07/23 09:32

shiolier

総合スコア1156

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

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

0

愚直に1文字ずつ見て置換していった方が早いと思います。
Cなら下記のような感じです。

C

1void chikan(char *s, char a, char b) 2{ 3 while (*s != '\0') { 4 if (*s == a) { 5 *s = b; 6 } else if (*s == b) { 7 *s = a; 8 } 9 s++; 10 } 11}

投稿2015/07/23 09:31

raccy

総合スコア21735

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

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

0

一番単純に、「一文字づつ処理する」です。
AだったらCに
CだったらAに
その他はそのまま。

投稿2015/07/23 09:30

mie

総合スコア229

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

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

0

文字列と同じ配列をもう一つ作るというのはどうでしょう?
で、その配列に置き換えた文字を(置き換えのない文字はそのまま)入れて、置き換えが終了した時点で元の文字列にコピーすればいいと思います。
・・・これなら元の文字列を壊す事がないので多数(2以上)の置き換えにも対応できます。

投稿2015/07/23 09:26

cateye

総合スコア6851

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問