aboutsummaryrefslogtreecommitdiff
path: root/shifting_letters2.c
blob: de202593bc59927d37baff7e910b18a1f834f410 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
// 2381. Shifting Letters II
#include "leetcode.h"

/*
 * you are given a string 's' of lowercase english letters and a 2d integer
 * array 'shifts' where 'shifts[i] = [start_i, end_i, direction_i]'. for every
 * 'i', shift the characters in 's' from the index 'start_i' to he index 'end_i'
 * (inclusive) forward if the 'direction_i = 1' or shift the characters backward
 * if 'direction_i = 0'. shifting a character forward means replacing it with
 * the next letter in the alphabet. similarily, shifting a character backward
 * means replacing it with the previous alphabetic character. return the final
 * string ater all such shifts to 's' are applied
 */

char *shiftingLetters(char *s, int **shifts, int shiftsSize,
                      int *shiftsColSize) {
  int n = strlen(s), *shift = (int *)calloc(n + 1, sizeof(int));
  for (int i = 0; i < shiftsSize; ++i) {
    int start = shifts[i][0], end = shifts[i][1], direction = shifts[i][2];
    shift[start] += (direction == 1 ? 1 : -1);
    if (end + 1 < n)
      shift[end + 1] -= (direction == 1 ? 1 : -1);
  }
  int curr = 0;
  for (int i = 0; i < n; ++i) {
    curr += shift[i];
    shift[i] = curr;
  }
  for (int i = 0; i < n; ++i) {
    int net = (shift[i] % 26 + 26) % 26;
    s[i] = 'a' + (s[i] - 'a' + net) % 26;
  }
  free(shift);
  return s;
}

int main() {
  char *s1 = "abc", *s2 = "dztz";
  int s1i[3][3] = {{0, 1, 0}, {1, 2, 1}, {0, 2, 1}},
      s2i[2][3] = {{0, 0, 0}, {1, 1, 1}};
  struct two_d_arr sh1, sh2;
  two_d_arr_init(&sh1, 3, 3, s1i);
  two_d_arr_init(&sh1, 2, 3, s2i);
  printf("%s\n", shiftingLetters(s1, sh1.arr, sh1.row_size,
                                 sh1.col_size)); // expect: ace
  printf("%s\n", shiftingLetters(s2, sh2.arr, sh2.row_size,
                                 sh2.col_size)); // expect: catz
}