Welcome to Subscribe On Youtube
3744. Find Kth Character in Expanded String 🔒
Description
You are given a string s consisting of one or more words separated by single spaces. Each word in s consists of lowercase English letters.
We obtain the expanded string t from s as follows:
- For each word in
s, repeat its first character once, then its second character twice, and so on.
For example, if s = "hello world", then t = "heelllllllooooo woorrrllllddddd".
You are also given an integer k, representing a valid index of the string t.
Return the kth character of the string t.
Example 1:
Input: s = "hello world", k = 0
Output: "h"
Explanation:
t = "heelllllllooooo woorrrllllddddd". Therefore, the answer is t[0] = "h".
Example 2:
Input: s = "hello world", k = 15
Output: " "
Explanation:
t = "heelllllllooooo woorrrllllddddd". Therefore, the answer is t[15] = " ".
Constraints:
1 <= s.length <= 105scontains only lowercase English letters and spaces' '.sdoes not contain any leading or trailing spaces.- All the words in
sare separated by a single space. 0 <= k < t.length. That is,kis a valid index oft.
Solutions
Solution 1: Math + Simulation
We first split the string $\textit{s}$ into multiple words by spaces. For each word $\textit{w}$, we can calculate the length it occupies in the expanded string $\textit{t}$ as $m=\frac{(1+|\textit{w}|)\cdot |\textit{w}|}{2}$.
If $k = m$, it means the $k$-th character is a space, and we can directly return a space.
If $k > m$, it means the $k$-th character is not in the expanded part of the current word. We subtract the expanded length $m$ of the current word and the space length $1$ from $k$, and continue processing the next word.
Otherwise, the $k$-th character is in the expanded part of the current word. We can find the $k$-th character by simulating the expansion process:
- Initialize a variable $\textit{cur} = 0$ to represent the number of characters that have been expanded so far.
- Iterate through each character $\textit{w}[i]$ of the word $\textit{w}$:
- Increase $\textit{cur}$ by $i + 1$.
- If $k < \textit{cur}$, it means the $k$-th character is $\textit{w}[i]$, and we return this character.
The time complexity is $O(n)$ and the space complexity is $O(n)$, where $n$ is the length of the string $\textit{s}$.
-
class Solution { public char kthCharacter(String s, long k) { for (String w : s.split(" ")) { long m = (1L + w.length()) * w.length() / 2; if (k == m) { return ' '; } if (k > m) { k -= m + 1; } else { long cur = 0; for (int i = 0;; ++i) { cur += i + 1; if (k < cur) { return w.charAt(i); } } } } return ' '; } } -
class Solution { public: char kthCharacter(string s, long long k) { stringstream ss(s); string w; while (ss >> w) { long long m = (1 + (long long) w.size()) * (long long) w.size() / 2; if (k == m) { return ' '; } if (k > m) { k -= m + 1; } else { long long cur = 0; for (int i = 0;; ++i) { cur += i + 1; if (k < cur) { return w[i]; } } } } return ' '; } }; -
class Solution: def kthCharacter(self, s: str, k: int) -> str: for w in s.split(): m = (1 + len(w)) * len(w) // 2 if k == m: return " " if k > m: k -= m + 1 else: cur = 0 for i in range(len(w)): cur += i + 1 if k < cur: return w[i] -
func kthCharacter(s string, k int64) byte { for _, w := range strings.Split(s, " ") { m := (1 + int64(len(w))) * int64(len(w)) / 2 if k == m { return ' ' } if k > m { k -= m + 1 } else { var cur int64 for i := 0; ; i++ { cur += int64(i + 1) if k < cur { return w[i] } } } } return ' ' } -
function kthCharacter(s: string, k: number): string { for (const w of s.split(' ')) { const m = ((1 + w.length) * w.length) / 2; if (k === m) { return ' '; } if (k > m) { k -= m + 1; } else { let cur = 0; for (let i = 0; ; ++i) { cur += i + 1; if (k < cur) { return w[i]; } } } } return ' '; }