リンク:https://ac.nowcoder.com/acm/problem/16644
ソース:牛客网
- ' - ' が出現すると、文字列を展開する操作が繰り返されることに気付いたので、関数を作成することを検討できます。
- 文字列を反復処理する方法は、文字列を後ろに移動させることですが、これは明らかに面倒ですし、区間の長さを計算すると複雑になります。最適な方法は、答えを格納するために別の文字列 ans を作成することです。
- もし a [i] が ' - ' でない場合、ans に直接追加します。
- ' - ' の場合は、展開された文字列を追加します。
- どのように展開するか?まず、無効な場合を排除します。
- 最初の無効な場合は、"a-b"->"ab"、"2-3"->"23" などです。この場合、文字または数字であるかどうかに関係なく、後の文字の ASCII コードが前の文字よりも 1 大きいことを統一的に理解できます。つまり、e-b == 1 の場合、空の文字列 "" を返します(e は ' - ' の前の文字を表し、b は ' - ' の後の文字を表します)。
- "ハイフンの両側が小文字または数字であり、ASCII コードの順序に従って、ハイフンの右側の文字が厳密に左側の文字よりも大きい場合。" 逆の面から入り、前の文字後の数字前の数字後の文字などになります。
そして、ans を書く
特殊なケースの考慮
- 先頭と末尾の ' - '、例えば “-a-d-”
- 連続する ' - '、例えば “---” この行のコードはこの問題を解決します
- 数字と文字の間の ' - '、例えば “1-a”
- ' - ' の左側の文字が右側の文字よりも大きい場合、例えば “d-a”