美文网首页
算法:字符串

算法:字符串

作者: Zack_H | 来源:发表于2019-03-18 16:02 被阅读0次

    Map

    • 332 重新安排行程
      使用Map统计时写法:
    for (int i = 0; i < keys.length; i++) {
        if (!map.containsKey(keys[i]))
            map.put(keys[i], new ArrayList<>());
        map.get(keys[i]).add(values[i]);
    }
    

    字符串

    • Api of string.h
      strlen: 返回值是unsigned int,注意unsigned int不能直接与负数比较。
      strcpy: char *strcpy(char *dest, const char *src)。
      strcat: extern char *strcat(char *dest, const char *src),dest不可以是常量池的字符串,必须是实例化后,且长度足够。
    • Api of limits.h
      INT_MIN: -2147483648
      INT_MAX: 2147483647
    • 344 反转字符串
      不使用额外变量交换数值 II:
    a = a+b;
    b = a-b;
    a = a-b;
    
    • 7 整数反转
      数值越界判断:
    while (x != 0) {
        int pop = x % 10;
        x /= 10;
        if (rev > INT_MAX/10 || (rev == INT_MAX / 10 && pop > 7)) return 0;
        if (rev < INT_MIN/10 || (rev == INT_MIN / 10 && pop < -8)) return 0;
        rev = rev * 10 + pop;
    }
    
    • 125 验证回文串
      双指针法 II: 设置头尾指针,遇到不合法情况跳过,合法情况下比较。
    while (i<j){
        while (('0'>s[i] || s[i]>'9') && ('a'>s[i] || s[i]>'z') && ('A'>s[i] || s[i]>'Z') && i<j)
            i++;
        while (('0'>s[j] || s[j]>'9') && ('a'>s[j] || s[j]>'z') && ('A'>s[j] || s[j]>'Z') && i<j)
            j--;
        if (s[i] != s[j])
            if ( ('0'<=s[i] && s[i]<='9') || !equalIgnoreCast(s[i],s[j]))
                return false;
        i++;
        j--;
    }
    
    • 8 字符串转换整数 (atoi)
      计算x的位数:log_{10}(x)
      各位数字构造负数:
    rev = rev*10 - pop;
    
    • 28 实现strStr()
      模式匹配常规模板:
    while (i<mainLen && j<pLen){
        if (main[i] == p[j]){
          i++;
          j++;
        }else{
            i = i - j;
            j = 0;
        }
    }
    

    KMP求next数组: 当p[0...k-1] == p[j-k...j-1]时,next[j] = k。

    • 14 最长公共前缀
      分治法:问题规模为1时返回原值,求左右两侧子问题解,取左右子解的LCP。
      二分查找法:取最短字符串作为初始串,取其左部分与全字符串数组比较,若是LCP,则取左;否则取右。直至左指针小于右指针跳出循环。
    while (low <= high) {
        int middle = (low + high) / 2;
        if (isCommonPrefix(strs, middle))
            low = middle + 1;
        else
            high = middle - 1;
    }
    return strs[0].substring(0, (low + high) / 2);
    

    相关文章

      网友评论

          本文标题:算法:字符串

          本文链接:https://www.haomeiwen.com/subject/tigvmqtx.html