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

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

ただいまの
回答率

87.49%

二つを入れ替える置換

解決済

回答 8

投稿

  • 評価
  • クリップ 4
  • VIEW 3,107

score 19

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 8

checkベストアンサー

+3

C言語のように配列アクセス可能なプログラミング言語ならば簡単です.
void exchange(char *str, int len, char a, char b)
{
  int i;
  for (i = 0; i < len; i++) {
    if (str[i] == a)
      str[i] = b;
    else if (str[i] == b)
      str[i] = a;
  }
}
ただし,配列アクセスをしないものだと,困難かもしれません.
僕も,一度別の文字Dを使う方法しか思いつきません.

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/07/23 21:00 編集

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

    キャンセル

+3

Rubyでいいなら、String#tr使えばいいだけだった。
"AABCCC".tr("AC", "CA") # => "CCBAAA"

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/07/23 21:07

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

    キャンセル

0

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

愚直に1文字ずつ見て置換していった方が早いと思います。
Cなら下記のような感じです。
void chikan(char *s, char a, char b)
{
  while (*s != '\0') {
    if (*s == a) {
      *s = b;
    } else if (*s == b) {
      *s = a;
    }
    s++;
  }
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

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

コマンドで簡単に。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

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

A -> C
C -> A

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

A -> B
B -> C

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

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


投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 87.49%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る