1f050dde942f68931ca6f24243c4d895

先放上窃格瓦拉。

我并不会算法, 也不懂什么数据结构,野路子程序员一个。但也很想学习一点算法和数据结构的基础知识,想起读书时代参加过几次 ACM ICPC ,觉得可以重拾老爱好去刷刷 OJ。正当我想着的时候,另一位同样的野路子程序员最近刚好在刷 leetcode ,就丢给我一个简单题,让我练练手(从入门到放弃)

题目链接如下:

https://leetcode.com/problems/isomorphic-strings/description/

我知道你们肯定懒得去看,我给你们翻译一下:

    给你两个字符串 一个叫 s 一个叫 t ,
    在不改变字符串顺序情况下,如果可以通过把字符做一个映射从 s 变成 t,
    那就输出 true,否则输出 false

    举个栗子:

    Input: s = "egg", t = "add"
    Output: true

    再举一个:

    Input: s = "foo", t = "bar"
    Output: false

    还有一个:

    Input: s = "paper", t = "title"
    Output: true

    另外,题目保证 s 和 t 长度是一致的

题目很简单啊,这个第一反应 循环一把索

f33c8ec80f113a5882c4e07410191fa1

然后想了想,一般来说这种题目都会坑你一把,估计把 ascii 里面可见字符都用上了,思路很简单,所以其实只要做一个简单的 hash 数组把字符串映射存下来,如果有冲突那就是不行的,如果没有冲突的处理完整个字符就稳稳的了。我们知道最小的可见字符是 ascii 32 的空格,所以我们在存的时候,可以考虑减去 32 来节约存储空间。
这种题目一看就很适合用入门级别C语言来搞定,于是掏出了我大学一年级水平的C语言,撸出了一波代码:

bool isIsomorphic(char* s, char* t) {
    char charArrS[95] = { -1 };
    char charArrT[95] = { -1 };
    int i = 0;
    while (s[i] != 0) {
        if (charArrS[s[i]-32] == -1 && charArrT[t[i]-32] == -1) {
            charArrS[s[i]-32] = t[i]-32;
            charArrT[t[i]-32] = s[i]-32;
        }else if (charArrS[s[i]-32] != t[i]-32 || charArrT[t[i]-32] != s[i]-32) {
            return false;
        }
        i++;
    }
    return true;
}

3d4e98478976450274003701df53c91a

啊,感觉编程真有趣啊。

当然,我也撸了一个 js 的版本,看上去就更不给力了。。。。

/**
 * @param {string} s
 * @param {string} t
 * @return {boolean}
 */
var isIsomorphic = function(s, t) {
  if (s.length <= 1 && t.length === s.length) {
    return true;
  }
  if (s.length != t.length) {
    return false;
  }
  var isOk = true
  var hashMap = []
  var hashMap2 = []
  var i = 0
  for (i = 0; i < s.length; i++) {
    var ts = s[i].charCodeAt(0);
    var tb = t[i].charCodeAt(0);
    if (hashMap[ts] == undefined) {
      if (hashMap2[tb] == undefined) {
        hashMap[ts] = tb
        hashMap2[tb] = 1
      } else {
        isOk = false;
        break;
      }
      continue;
    } else {
      if (hashMap[ts] == tb) {
        continue;
      } else {
        isOk = false;
        break;
      }
    }
  }
  return isOk;
};