teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

3

コード追加

2021/11/18 21:09

投稿

退会済みユーザー
answer CHANGED
@@ -53,4 +53,4 @@
53
53
  ```
54
54
  ですが、このオブジェクトが持っているのは、各文字が与えられた文字列の中で出現する合計の回数です。なので、たとえば、文字`a` に対して `count`オブジェクトから`3` という数字が分かっても、この`3`の意味するところとして、どこかに`a`が3連続しているのかもしれないし、あるいは、文字列の先頭に1個の`a`があり、末尾に2連続の`a` があるのかもしれません。しかし、`"bbbaacadee"`での`a`の出現場所と各回数を見ると、これらのどちらでもありません。このように、`count` には、各文字がどこに(それぞれ各)何回という情報が抜け落ちてしまっています。ですので、この`count` から、目的とするコード化された文字列(入力が`bbbaacadee`ならば、`3b2a1c1a1d2e`)を得るのは難しいです。
55
55
 
56
- 先に正規表現と`replace`を使ったコードを挙げましたが、質問にある`arrayStrings`のように、一文字ずつ読んで処理するforループで目的を達成しようとするなら、`count`のような文字と総出現回数のマップではなく、何らか別のデータ構造を再考する必要があります。
56
+ 先に正規表現と`replace`を使ったコードを挙げましたが、質問にある`arrayStrings`のように、一文字ずつ読んで処理するforループで目的を達成しようとするなら、`count`のような文字と総出現回数のマップではなく、何らか別のデータ構造なりアルゴリズムを再考する必要があります。

2

コード追加

2021/11/18 21:09

投稿

退会済みユーザー
answer CHANGED
@@ -26,4 +26,31 @@
26
26
  "abcdefgh => 1a1b1c1d1e1f1g1h => abcdefgh" true
27
27
  "zzzzz => 5z => zzzzz" true
28
28
 
29
- ???? [サンプル](https://codepen.io/kilesa/pen/bGrzOpz?editors=0012) @codepen
29
+ ???? [サンプル](https://codepen.io/kilesa/pen/bGrzOpz?editors=0012) @codepen
30
+
31
+
32
+ ### 追記
33
+
34
+ 質問にある、作成途中のcountStringのコード
35
+ ```javascript
36
+ function countString(str) {
37
+ let arrayStrings = str.split("")
38
+ let count = {};
39
+
40
+ for (let i = 0; i < arrayStrings.length; i++) {
41
+ let a = arrayStrings[i]
42
+
43
+ let elm = arrayStrings[i];
44
+ count[elm] = (count[elm] || 0) + 1;
45
+ }
46
+ return count
47
+ }
48
+ ```
49
+ についてですが、ここまでで作られる`count` オブジェクトを使って、意図しているコード化を行うのは難しいです。
50
+ たとえば、`"bbbaacadee"`という文字列からは、`count` は以下のようなオブジェクトになります。
51
+ ```
52
+ { b: 3, a: 3, c: 1, d :1, e :2 }
53
+ ```
54
+ ですが、このオブジェクトが持っているのは、各文字が与えられた文字列の中で出現する合計の回数です。なので、たとえば、文字`a` に対して `count`オブジェクトから`3` という数字が分かっても、この`3`の意味するところとして、どこかに`a`が3連続しているのかもしれないし、あるいは、文字列の先頭に1個の`a`があり、末尾に2連続の`a` があるのかもしれません。しかし、`"bbbaacadee"`での`a`の出現場所と各回数を見ると、これらのどちらでもありません。このように、`count` には、各文字がどこに(それぞれ各)何回という情報が抜け落ちてしまっています。ですので、この`count` から、目的とするコード化された文字列(入力が`bbbaacadee`ならば、`3b2a1c1a1d2e`)を得るのは難しいです。
55
+
56
+ 先に正規表現と`replace`を使ったコードを挙げましたが、質問にある`arrayStrings`のように、一文字ずつ読んで処理するforループで目的を達成しようとするなら、`count`のような、文字と総出現回数のマップではなく、何らか別のデータ構造を再考する必要があります。

1

テキスト修正

2021/11/18 20:41

投稿

退会済みユーザー
answer CHANGED
@@ -25,6 +25,5 @@
25
25
  "pppppppppbbzza => 9p2b2z1a => pppppppppbbzza" true
26
26
  "abcdefgh => 1a1b1c1d1e1f1g1h => abcdefgh" true
27
27
  "zzzzz => 5z => zzzzz" true
28
- "zzzzz" "5z" "zzzzz" true
29
28
 
30
29
  ???? [サンプル](https://codepen.io/kilesa/pen/bGrzOpz?editors=0012) @codepen