日28 -与えられた数値で最も小さいストリング
問題
The numeric value of a lowercase character is defined as its position
(1-indexed)
in the alphabet, so the numeric value ofa
is1
, the numeric value ofb
is2
, the numeric value ofc
is3
, and so on.The numeric value of a string consisting of lowercase characters is defined as the sum of its characters' numeric values. For example, the numeric value of the string
"abe"
is equal to1 + 2 + 5 = 8
.You are given two integers
n
andk
. Return the lexicographically smallest string with length equal ton
and numeric value equal tok
.Note that a string
x
is lexicographically smaller than stringy
ifx
comes beforey
in dictionary order, that is, eitherx
is a prefix ofy
, or ifI
is the first position such thatx[i] != y[I]
, thenx[I]
comes beforey[I]
in alphabetic order.
例1 :
Input: n = 3, k = 27
Output: "aay"
Explanation: The numeric value of the string is 1 + 1 + 25 = 27, and it is the smallest string with such a value and length equal to 3.
例2 :Input: n = 5, k = 73
Output: "aaszz"
制約1 <= n <= 105
n <= k <= 26 * n
テスト
import pytest
from .Day28_SmallestStringWithAGivenNumericValue import Solution
s = Solution()
@pytest.mark.parametrize(
"n,k,expected",
[
(3, 27, "aay"),
(5, 73, "aaszz"),
],
)
def test_get_smallest_string(n, k, expected):
assert s.getSmallestString(n, k) == expected
解決策
from collections import deque
class Solution:
def getSmallestString(self, n: int, k: int) -> str:
d = deque()
i = n - 1
while i >= 0:
a = min(k - i, 26)
d.extendleft(chr(a + ord("a") - 1))
k -= a
i -= 1
return "".join(d)
分析
解説
私の解決性能はすごい!私は標準的な文字列連結を試みました、しかし、それはさらに悪化しました.私がここでよりよくすることができるかわからない.私は学ぶべきことがたくさんある.私は、キューが拡張左ビットでストリングを構築するのが速いと思いました.
解決自体は簡単です.
n -1
からスタートし、帰り道を進め、可能な最大値をa
に割り当てる.これをキューに追加します.最後にキューを文字列に変換します.アルファベットで26文字があるので、26
は最大可能な価値です.私たちは本質的にZを切り刻んでいます.Reference
この問題について(日28 -与えられた数値で最も小さいストリング), 我々は、より多くの情報をここで見つけました https://dev.to/ruarfff/day-28-smallest-string-with-a-given-numeric-value-46g8テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol