The Indian Engineer

Problem 3271 Hash Divided Strings

Posted on 3 mins

String Hashing

Problem Statement

Link - Problem 3271

Question

You are given a string s of length n and an integer k, where n is a multiple of k. Your task is to hash the string s into a new string called result, which has a length of n / k.

First, divide s into n / k substrings , each with a length of k. Then, initialize result as an empty string.

For each substring in order from the beginning:

Return result.

A substring is a contiguous non-empty sequence of characters within a string.

Example 1

Input: s = "abcd", k = 2

Output: "bf"

Explanation:

First substring: "ab", 0 + 1 = 1, 1 % 26 = 1, result[0] = 'b'.

Second substring: "cd", 2 + 3 = 5, 5 % 26 = 5, result[1] = 'f'.

Example 2

Input: s = "mxz", k = 3

Output: "i"

Explanation:

The only substring: "mxz", 12 + 23 + 25 = 60, 60 % 26 = 8, result[0] = 'i'.

Constraints

- `1 <= k <= 100`
- `k <= s.length <= 1000`
- `s.length` is divisible by `k`.
- `s` consists only of lowercase English letters.

Solution

class Solution {
public:
    string stringHash(string s, int k) {
        std::ios::sync_with_stdio(false);
        int n = s.length();
        int subcnt = n / k;
        string result = "";

        for (int i = 0; i < subcnt; i++) {
            int sum = 0;

            for (int j = 0; j < k; j++) {
                sum += s[i * k + j] - 'a';
            }

            int val = sum % 26;
            result += (char)(val + 'a');
        }

        return result;
    }
};

Complexity Analysis

| Algorithm       | Time Complexity | Space Complexity |
| --------------- | --------------- | ---------------- |
| Hash generation | O(N)            | O(1)             |

Explanation

1. Intuition

This question is also relatively simple. We need to do exactly what the question asks for.

- Calculate how many substrings we can form.
- That is equal to the length of the string divided by k.
- We need that many iterations.
- For each iteration, calculate the sum of the hash values of the characters.
- Hashvalue is simply the difference of the character and 'a'.
- Find the remainder of the sum when divided by 26.
- Append the character corresponding to this remainder to the result string.

2. Implementation

- Declare a variable `n` to store the length of the string.
- Declare a variable `subcnt` to store the number of substrings.
- Declare a string `result` to store the result.
- `subcnt` = `n` / `k`.
- Iterate over from `0` to `subcnt`.
  - Declare a variable `sum` to store the sum of the hash values of the characters.
  - Iterate over from `0` to `k`.
    - Add the hash value of the character to the `sum`.
    - Hash value is `s[i * k + j] - 'a'`.
  - Find the remainder of the `sum` when divided by 26.
  - Append the character corresponding to this remainder to the `result`.