3365. Rearrange K Substrings to Form Target String
Description
You are given two strings s
and t
, both of which are anagrams of each other, and an integer k
.
Your task is to determine whether it is possible to split the string s
into k
equal-sized substrings, rearrange the substrings, and concatenate them in any order to create a new string that matches the given string t
.
Return true
if this is possible, otherwise, return false
.
An anagram is a word or phrase formed by rearranging the letters of a different word or phrase, using all the original letters exactly once.
A substring is a contiguous non-empty sequence of characters within a string.
Example 1:
Input: s = "abcd", t = "cdab", k = 2
Output: true
Explanation:
- Split
s
into 2 substrings of length 2:["ab", "cd"]
. - Rearranging these substrings as
["cd", "ab"]
, and then concatenating them results in"cdab"
, which matchest
.
Example 2:
Input: s = "aabbcc", t = "bbaacc", k = 3
Output: true
Explanation:
- Split
s
into 3 substrings of length 2:["aa", "bb", "cc"]
. - Rearranging these substrings as
["bb", "aa", "cc"]
, and then concatenating them results in"bbaacc"
, which matchest
.
Example 3:
Input: s = "aabbcc", t = "bbaacc", k = 2
Output: false
Explanation:
- Split
s
into 2 substrings of length 3:["aab", "bcc"]
. - These substrings cannot be rearranged to form
t = "bbaacc"
, so the output isfalse
.
Constraints:
1 <= s.length == t.length <= 2 * 105
1 <= k <= s.length
s.length
is divisible byk
.s
andt
consist only of lowercase English letters.- The input is generated such that
s
andt
are anagrams of each other.
Solutions
Solution 1: Hash Table
Let the length of the string $s$ be $n$, then the length of each substring is $m = n / k$.
We use a hash table $\textit{cnt}$ to record the difference between the number of occurrences of each substring of length $m$ in string $s$ and in string $t$.
We traverse the string $s$, extracting substrings of length $m$ each time, and update the hash table $\textit{cnt}$.
Finally, we check whether all values in the hash table $\textit{cnt}$ are $0$.
The time complexity is $O(n)$, and the space complexity is $O(n)$. Here, $n$ is the length of the string $s$.
Python3
class Solution:
def isPossibleToRearrange(self, s: str, t: str, k: int) -> bool:
cnt = Counter()
n = len(s)
m = n // k
for i in range(0, n, m):
cnt[s[i : i + m]] += 1
cnt[t[i : i + m]] -= 1
return all(v == 0 for v in cnt.values())
Java
class Solution {
public boolean isPossibleToRearrange(String s, String t, int k) {
Map<String, Integer> cnt = new HashMap<>(k);
int n = s.length();
int m = n / k;
for (int i = 0; i < n; i += m) {
cnt.merge(s.substring(i, i + m), 1, Integer::sum);
cnt.merge(t.substring(i, i + m), -1, Integer::sum);
}
for (int v : cnt.values()) {
if (v != 0) {
return false;
}
}
return true;
}
}
C++
class Solution {
public:
bool isPossibleToRearrange(string s, string t, int k) {
unordered_map<string, int> cnt;
int n = s.size();
int m = n / k;
for (int i = 0; i < n; i += m) {
cnt[s.substr(i, m)]++;
cnt[t.substr(i, m)]--;
}
for (auto& [_, v] : cnt) {
if (v) {
return false;
}
}
return true;
}
};
Go
func isPossibleToRearrange(s string, t string, k int) bool {
n := len(s)
m := n / k
cnt := map[string]int{}
for i := 0; i < n; i += m {
cnt[s[i:i+m]]++
cnt[t[i:i+m]]--
}
for _, v := range cnt {
if v != 0 {
return false
}
}
return true
}
TypeScript
function isPossibleToRearrange(s: string, t: string, k: number): boolean {
const cnt: Record<string, number> = {};
const n = s.length;
const m = Math.floor(n / k);
for (let i = 0; i < n; i += m) {
const a = s.slice(i, i + m);
cnt[a] = (cnt[a] || 0) + 1;
const b = t.slice(i, i + m);
cnt[b] = (cnt[b] || 0) - 1;
}
return Object.values(cnt).every(x => x === 0);
}