zoukankan      html  css  js  c++  java
  • 算法

    算法

    大数据

    • bitmap

    排序

    • 桶排序

    • 计数排序

    • 字典序

    字符串

    • 字符串匹配

      • KMP
        • 关键是构造出一个数组, 通过该数据判断从哪一个字符开始匹配
    • 字符串最长的不重复字串

      • 滑动窗口算法, 根据 start 与 end 两个变量锁定一个窗口; 为了进一步提高字符串不重复的查找效率, 采用dict存储, 字符为key, 下标为value, 会实时的更新
        • 关于采用dict的
          • 在更新index时, 需要将新的index与老的index进行比较, 老的大, 则表示出现了重复的字符, 则在更新index时, 将老的index + 1, 该值就是下一个字串的start, 一次类推
    • 字符串的最长回文

      • 中心扩展法O(n^2), 需要注意字符串长度的奇偶性
      • manacher算法O(n)
        • 添加"#"符号

          • 最重要的是要明白 max_right 与 center 与 i 与 pp[i']的关系, max_right - i > P[i']则P[i'] == P[i], 否则只是部分匹配, 其中 i' 的为 2 * center - i

          • 用到的技巧: 添加'#'将原来的字符串都转为奇数长度

          • manacher最终的目的就是计算P[i]数组, 使用mancher就是求出P[i]

          • 核心代码

            
            for(int i = 0; i < adapted_s.size(); i++){
            	  // 其中max_right与center锁定的字符串就是一个回文, 当max_right大于i时, 是该回文字符串的字串
            	  // 其中的max_left是由center与max_right, 动态的改变max_right和center完成max_left的改变
                p[i] = max_right > i ? (p[2 * center - i] >l max_right - i+1 ? max_right - i+1 : p[2 * center - i]) : 1;
                while(i - p[i] >= 0 && s2[p[i] + i] == s2[i - p[i]])  // 这里继续完善p[i]
                    p[i]++;
                
                if(p[i] + i - 1 > max_right){    // 定位max_right
                    mx = p[i] + i - 1;
                    mid = i;
                }
                
            	  ....
            }
            
        • 完整代码:
          ```
          class Solution:

                 def longestPalindrome(self, s):
                     """
                     :type s: str
                     :rtype: str
                     """
                     new_s = '#' + '#'.join(s) + '#'
                     new_s_len = len(new_s)
                     p = [0] * new_s_len
                    
                     max_right = 0    
                     center = 0
                     
                     for i in range(new_s_len):
                         if i < max_right:
                             p[i] = min(p[2 * center - i], max_right - 1)   
                         else:
                             p[i] = 1
             
                         while i - p[i] >= 0 and i + p[i] < new_s_len and new_s[p[i] + i] == new_s[i - p[i]]:
                             p[i] += 1
             
                         if p[i] + i - 1 > max_right:
                             max_right = p[i] + i - 1               
                             center = i         
                     max_value = max(p)
                     max_index = p.index(max_value)
                     sub = new_s[max_index - max_value + 1:max_index + max_value]
                     return sub.replace('#', '')
          
          
          
      • 还可以将中心扩展与manacher的'#'思想结合
  • 相关阅读:
    jQuery学习----简单介绍,基本使用,操作样式,动画
    JavaScript进阶----关于数字的方法,Math对象,日期对象,定时器,函数,for in
    MR的常用命令
    YARN的三种调度器
    yarn资源管理
    yarn的架构设计
    yarn的web界面查看log时出现的问题
    HDFS副本放置策略
    HDFS读流程
    HDFS写流程
  • 原文地址:https://www.cnblogs.com/megachen/p/9555944.html
Copyright © 2011-2022 走看看