Off-by-one on range boundaries
Wrong move: Loop endpoints miss first/last candidate.
Usually fails on: Fails on minimal arrays and exact-boundary answers.
Fix: Re-derive loops from inclusive/exclusive ranges before coding.
Move from brute-force thinking to an efficient approach using array strategy.
You are given a 0-indexed string s and a 0-indexed integer array spaces that describes the indices in the original string where spaces will be added. Each space should be inserted before the character at the given index.
s = "EnjoyYourCoffee" and spaces = [5, 9], we place spaces before 'Y' and 'C', which are at indices 5 and 9 respectively. Thus, we obtain "Enjoy Your Coffee".Return the modified string after the spaces have been added.
Example 1:
Input: s = "LeetcodeHelpsMeLearn", spaces = [8,13,15] Output: "Leetcode Helps Me Learn" Explanation: The indices 8, 13, and 15 correspond to the underlined characters in "LeetcodeHelpsMeLearn". We then place spaces before those characters.
Example 2:
Input: s = "icodeinpython", spaces = [1,5,7,9] Output: "i code in py thon" Explanation: The indices 1, 5, 7, and 9 correspond to the underlined characters in "icodeinpython". We then place spaces before those characters.
Example 3:
Input: s = "spacing", spaces = [0,1,2,3,4,5,6] Output: " s p a c i n g" Explanation: We are also able to place spaces before the first character of the string.
Constraints:
1 <= s.length <= 3 * 105s consists only of lowercase and uppercase English letters.1 <= spaces.length <= 3 * 1050 <= spaces[i] <= s.length - 1spaces are strictly increasing.Problem summary: You are given a 0-indexed string s and a 0-indexed integer array spaces that describes the indices in the original string where spaces will be added. Each space should be inserted before the character at the given index. For example, given s = "EnjoyYourCoffee" and spaces = [5, 9], we place spaces before 'Y' and 'C', which are at indices 5 and 9 respectively. Thus, we obtain "Enjoy Your Coffee". Return the modified string after the spaces have been added.
Start with the most direct exhaustive search. That gives a correctness anchor before optimizing.
Pattern signal: Array · Two Pointers
"LeetcodeHelpsMeLearn" [8,13,15]
"icodeinpython" [1,5,7,9]
"spacing" [0,1,2,3,4,5,6]
Source-backed implementations are provided below for direct study and interview prep.
// Accepted solution for LeetCode #2109: Adding Spaces to a String
class Solution {
public String addSpaces(String s, int[] spaces) {
StringBuilder ans = new StringBuilder();
for (int i = 0, j = 0; i < s.length(); ++i) {
if (j < spaces.length && i == spaces[j]) {
ans.append(' ');
++j;
}
ans.append(s.charAt(i));
}
return ans.toString();
}
}
// Accepted solution for LeetCode #2109: Adding Spaces to a String
func addSpaces(s string, spaces []int) string {
var ans []byte
for i, j := 0, 0; i < len(s); i++ {
if j < len(spaces) && i == spaces[j] {
ans = append(ans, ' ')
j++
}
ans = append(ans, s[i])
}
return string(ans)
}
# Accepted solution for LeetCode #2109: Adding Spaces to a String
class Solution:
def addSpaces(self, s: str, spaces: List[int]) -> str:
ans = []
j = 0
for i, c in enumerate(s):
if j < len(spaces) and i == spaces[j]:
ans.append(' ')
j += 1
ans.append(c)
return ''.join(ans)
// Accepted solution for LeetCode #2109: Adding Spaces to a String
/**
* [2109] Adding Spaces to a String
*
* You are given a 0-indexed string s and a 0-indexed integer array spaces that describes the indices in the original string where spaces will be added. Each space should be inserted before the character at the given index.
*
* For example, given s = "EnjoyYourCoffee" and spaces = [5, 9], we place spaces before 'Y' and 'C', which are at indices 5 and 9 respectively. Thus, we obtain "Enjoy <u>Y</u>our <u>C</u>offee".
*
* Return the modified string after the spaces have been added.
*
* Example 1:
*
* Input: s = "LeetcodeHelpsMeLearn", spaces = [8,13,15]
* Output: "Leetcode Helps Me Learn"
* Explanation:
* The indices 8, 13, and 15 correspond to the underlined characters in "Leetcode<u>H</u>elps<u>M</u>e<u>L</u>earn".
* We then place spaces before those characters.
*
* Example 2:
*
* Input: s = "icodeinpython", spaces = [1,5,7,9]
* Output: "i code in py thon"
* Explanation:
* The indices 1, 5, 7, and 9 correspond to the underlined characters in "i<u>c</u>ode<u>i</u>n<u>p</u>y<u>t</u>hon".
* We then place spaces before those characters.
*
* Example 3:
*
* Input: s = "spacing", spaces = [0,1,2,3,4,5,6]
* Output: " s p a c i n g"
* Explanation:
* We are also able to place spaces before the first character of the string.
*
*
* Constraints:
*
* 1 <= s.length <= 3 * 10^5
* s consists only of lowercase and uppercase English letters.
* 1 <= spaces.length <= 3 * 10^5
* 0 <= spaces[i] <= s.length - 1
* All the values of spaces are strictly increasing.
*
*/
pub struct Solution {}
// problem: https://leetcode.com/problems/adding-spaces-to-a-string/
// discuss: https://leetcode.com/problems/adding-spaces-to-a-string/discuss/?currentPage=1&orderBy=most_votes&query=
// submission codes start here
impl Solution {
pub fn add_spaces(s: String, spaces: Vec<i32>) -> String {
String::new()
}
}
// submission codes end
#[cfg(test)]
mod tests {
use super::*;
#[test]
#[ignore]
fn test_2109_example_1() {
let s = "LeetcodeHelpsMeLearn".to_string();
let spaces = vec![8, 13, 15];
let result = "Leetcode Helps Me Learn".to_string();
assert_eq!(Solution::add_spaces(s, spaces), result);
}
#[test]
#[ignore]
fn test_2109_example_2() {
let s = "icodeinpython".to_string();
let spaces = vec![1, 5, 7, 9];
let result = "i code in py thon".to_string();
assert_eq!(Solution::add_spaces(s, spaces), result);
}
#[test]
#[ignore]
fn test_2109_example_3() {
let s = "spacing".to_string();
let spaces = vec![0, 1, 2, 3, 4, 5, 6];
let result = " s p a c i n g".to_string();
assert_eq!(Solution::add_spaces(s, spaces), result);
}
}
// Accepted solution for LeetCode #2109: Adding Spaces to a String
function addSpaces(s: string, spaces: number[]): string {
const ans: string[] = [];
for (let i = 0, j = 0; i < s.length; i++) {
if (i === spaces[j]) {
ans.push(' ');
j++;
}
ans.push(s[i]);
}
return ans.join('');
}
Use this to step through a reusable interview workflow for this problem.
Two nested loops check every pair of elements. The outer loop picks one element, the inner loop scans the rest. For n elements that is n × (n−1)/2 comparisons = O(n²). No extra memory — just two loop variables.
Each pointer traverses the array at most once. With two pointers moving inward (or both moving right), the total number of steps is bounded by n. Each comparison is O(1), giving O(n) overall. No auxiliary data structures are needed — just two index variables.
Review these before coding to avoid predictable interview regressions.
Wrong move: Loop endpoints miss first/last candidate.
Usually fails on: Fails on minimal arrays and exact-boundary answers.
Fix: Re-derive loops from inclusive/exclusive ranges before coding.
Wrong move: Advancing both pointers shrinks the search space too aggressively and skips candidates.
Usually fails on: A valid pair can be skipped when only one side should move.
Fix: Move exactly one pointer per decision branch based on invariant.