docs: private double[][] _step(double[][] state, char ch1, char ch2) {
      double cost;
      _shift(state);
      state[2][0] = state[1][0] + deletionDistance;
      for (int i = 0; i < morseBase.length(); i++) {
        cost = (morseBase.charAt(i) == ch1) ? 0 : replaceDistance;
        state[2][i + 1] = Math.min(state[2][i] + insertionDistance,
            state[1][i] + cost);
        state[2][i + 1] = Math.min(state[2][i + 1],
            state[1][i + 1] + deletionDistance);
        if (i > 0 && ch2 != 0x00 && (morseBase.charAt(i - 1) == ch1)
            && (morseBase.charAt(i) == ch2)) {
          state[2][i + 1] = Math.min(state[2][i + 1],
              state[0][i - 1] + transpositionDistance);
        }
      }
      return state;
    }