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

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

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

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

3回答

1467閲覧

文字が連続して続く場合の文字列の圧縮

tetsu1231

総合スコア9

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2023/04/26 22:52

編集2023/04/27 00:11

実現したいこと

文字列の圧縮

前提

Hodge は文章を短く表示するアプリを作成しており、文字が連続して 2 回以上続く場合は文字を数字に置き換えようと考えています。アルファベットで書かれた文字列 s が与えられるので、再帰を使って連続で続いた文字を数字に置き換える、stringCompression という関数を作成してください。

stringCompression("aaabbb") --> a3b3
stringCompression("aaabbbc") --> a3b3c
stringCompression("aaabbbCCL") --> a3b3C2L
stringCompression("aaabbbCCLL") --> a3b3C2L2
stringCompression("abceeaaaddbbb") --> abce2a3d2b3
stringCompression("aaabbbaaaaccaaaaba") --> a3b3a4c2a4ba
stringCompression("a") --> a

ヒント

0番目のaがどれくらい連続しているか調べるために、0番目と1番目を比較、0番目とと2番目を比較… というように調べていきます。比較して2つの値が異なったときに、文字と連続した数値を戻り値に加えていきましょう。

発生している問題・エラーメッセージ

解き方が分からない(分からないなりに、なるべく頑張って途中まで書いたコードを記載します。)

試したいこと

解き方が皆目検討が付かず、上記ヒント以外で何か助言をいただけると幸いです。

該当のソースコード

python

1def stringCompression(s): 2 # 関数を完成させてください 3 for i in range(len(s)): 4 if stringCompression(s[i]) == stringCompression(s[i+1]): 5 count += 1 6 return stringCompression(s[i])+count

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

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

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

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

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

guest

回答3

0

ベストアンサー

習っていると思いますが、再帰は以下のことを考えて作ります。

  • 一段階進むにはどうすればいいか
    一番左のものを圧縮して、残りを圧縮する。
    例) aaabbbcc を圧縮したもの ー> a3 + bbbcc を圧縮したもの。
  • どうなると終端で結果は?
    すべての文字が同じであれば、数えて圧縮して返す。
    例) ccを圧縮 ー> c2

まずはこれで考えてみてください。

作ると以下のようになります。 説明のためにだいぶ冗長に書きました。

python

1def stringCompression(s): 2 for i in range(len(s)): # 1文字ずつ順に見ていく。 3 if s[i] != s[0]: #先頭と違う文字が出たら数えおわり 4 if i == 1: 5 len_str = "" # 文字の個数は1個だったらなにも無し 6 else: 7 len_str = f"{i}" # その他は数文字の個数 8 9 compressed = f"{s[0]}{len_str}" # 圧縮した表現 10 11 remainder = s[i:] # 残りの文字列 12 13 return compressed + stringCompression(remainder) 14 15 else: # 全部同じ文字だったら 16 compressed = f"{s[0]}{i+1}" # 全部数えて圧縮 17 return compressed

簡潔に書くとこんな感じ

python

1def stringCompression(s): 2 for i in range(len(s)): 3 if s[i] != s[0]: 4 return f"{s[0]}{i if i != 1 else ''}" + stringCompression(s[i:]) 5 else: 6 return f"{s[0]}{i+1}"

投稿2023/04/27 01:50

編集2023/04/27 01:54
TakaiY

総合スコア12765

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

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

0

上記ヒント以外で何か助言をいただけると幸いです。

ヒントの話以外をしろと言っているところにヒントの話をして申し訳ないのですが、
このヒントは例えばこういう意味です:

python

1def stringCompression(s): 2 for i in range(1,len(s)): # 0番目のaがどれくらい連続しているか調べるために、0番目と1番目を比較、0番目とと2番目を比較… というように調べていきます。 3 if s[0] != s[i]: # 比較して2つの値が異なったときに 4 return s[0] + (str(i) if i>1 else "") + stringCompression(s[i:]) # 文字と連続した数値を戻り値に加えていきましょう。

あとはifに入らずforを抜けたらどうすんだとか、
空文字が渡されたとか
そういう細かいケースを考えて付け加えて終わりです

投稿2023/04/27 01:31

ozwk

総合スコア13521

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

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

0

まず「連続する文字」と「その個数」を保持する変数を用意します。
そして、文字列の先頭から順に、以下のような処理を行います。

  • 連続する文字と同じなら個数だけを増やします。
  • 異なる文字になれば、連続する文字と個数を更新します。

Python

1def f(s, pos=0, c='', cnt=0): 2 if pos >= len(s): 3 print(f'{c}{cnt}個') 4 return # 終わり 5 6 cur = s[pos] 7 if cur == c: # 同じなら個数が増えるだけ 8 cnt += 1 9 else: # 異なれば連続する文字を更新する 10 print(f'{c}{cnt}個') 11 c, cnt = cur, 1 12 13 return f(s, pos+1, c, cnt) 14 15f('aabcc')

上記のコードにおいてprintしているところを、結果の文字列として蓄積して返すように修正すると目的の処理ができます。
なお、提示コードのようにループを使うと「そもそも再帰イラナクネ?」となりそうですが。

投稿2023/04/27 01:50

編集2023/04/27 12:43
can110

総合スコア38266

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問