[Leetcode][第1392题][JAVA][最快乐前缀][KMP][字符串编码]

【问题描述】[困难]

在这里插入图片描述

【解答思路】

1. Rabin-Karp 字符串编码(详见总结)

在这里插入图片描述
关于为什么哈希值计算乘数为31,说法是,首先31是质数,其次编译器会将31*i 优化为 (i<<5)-i
时间复杂度:O(N^2) 空间复杂度:O(1)

// 本质上就是循环比较前缀与后缀是否相等
// 利用substring equals会超时
// 利用字符串hash值来进行比较,每次也不需要重新计算
// 对于前缀 hash = hash*31 + 新添头字符ch
// 对于后缀 hash = hash + 新添尾字符*31^t   (t为后缀长度减1)
// 有几次提交结果是12ms 不知道是什么原因
public String longestPrefix(String s) {int len = s.length();char chars[] = s.toCharArray();int max = 0, iHash = 0, jHash = 0, times = 1;for(int i=1; i<len; i++,times*=31){iHash = iHash*31 + chars[i-1];jHash += chars[len-i]*times;if(iHash==jHash)    max = i;}return s.substring(0,max);
}
2. KMP

在这里插入图片描述
在这里插入图片描述
时间复杂度:O(N) 空间复杂度:O(1)

public String longestPrefix(String s) {int[] maxMatchLens = new int[s.length()];int currentLen = 0;for (int i = 1; i < s.length(); i++) {while (currentLen > 0 && s.charAt(i) != s.charAt(currentLen)) {currentLen = maxMatchLens[currentLen - 1];}if (s.charAt(i) == s.charAt(currentLen)) {currentLen++;}maxMatchLens[i] = currentLen;}return s.substring(0, currentLen);
}

【总结】

1.Rabin-Karp 字符串编码

在这里插入图片描述

2.KMP匹配

返回起始坐标 (text里面找pattern)

public String longestPrefix(String s) {int[] maxMatchLens = new int[s.length()];int currentLen = 0;for (int i = 1; i < s.length(); i++) {while (currentLen > 0 && s.charAt(i) != s.charAt(currentLen)) {currentLen = maxMatchLens[currentLen - 1];}if (s.charAt(i) == s.charAt(currentLen)) {currentLen++;}maxMatchLens[i] = currentLen;}return s.substring(0, currentLen);
}private int[] getMaxMatchLens(String pattern) {int[] maxMatchLens = new int[pattern.length()];int currentLen = 0;for (int i = 1; i < pattern.length(); i++) {while (currentLen > 0 && pattern.charAt(i) != pattern.charAt(currentLen)) {currentLen = maxMatchLens[currentLen - 1];}if (pattern.charAt(i) == pattern.charAt(currentLen)) {currentLen++;}maxMatchLens[i] = currentLen;}return maxMatchLens;
}
3. KMP 算法基础知识

在这里插入图片描述

转载链接:https://leetcode-cn.com/problems/longest-happy-prefix/solution/ni-zhen-de-li-jie-kmpma-jiao-ni-xun-su-zhang-wo-bi/
转载链接:https://leetcode-cn.com/problems/longest-happy-prefix/solution/zui-chang-kuai-le-qian-zhui-by-leetcode-solution/
参考链接:https://leetcode-cn.com/problems/longest-happy-prefix/solution/javazi-fu-chuan-hash-fu-za-du-on-7ms-zhi-xu-9xing-/
参考链接:https://blog.csdn.net/V_0617/article/details/79114860

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/425309.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

平面图转对偶图19_03_21校内训练 [Everfeel]

对于每个平面图&#xff0c;都有唯一一个对偶图与之对应。若G‘是平面图G的对偶图&#xff0c;则满足&#xff1a; G中每一条边的两个节点对应着G中有公共边的面&#xff0c;包括最外部无限大的面。 直观地讲&#xff0c;红色标出来的图就是蓝色标出的图的对偶图。 求出一个平面…

pat 1085 Perfect Sequence (25) 二分查找

题意 给我们一个数串 让我们从中挑选数字 构成一个集合 使得集合中最小元素m和最大元素M 满足 m*p>M 求出集合的最大数量 分析 看下条件就可以发现 m*p >M 也就是在数串中找m*p>x x的上界 那么排下序二分找即可 code #include<bits/stdc.h> using nam…

58如何调出eclipse左边文件栏

如何让windows的左侧显示 点击windows --show view--project explore 像eclipse底部的一些信息展示不见了&#xff0c;比如代码输出结果展示的 console 等都可以通过 ShowView 找到并显示出来哦&#xff0c;如果没有就去 Window -> ShowView -> other去找吧

[JAVA][算法] [字符串匹配]KMP

我们为什么需要KMP&#xff1f; 在字符串匹配问题中&#xff0c;我们需要找到匹配串pattern在原串text中的位置&#xff0c;一种显而易见的思路就是暴力匹配&#xff0c;如图所示&#xff0c;我们把pattern放置到text中的每个位置进行比较即可。 但是大家可以发现&#xff0c;…

微信小程序入门与实战

第1章 什么是微信小程序&#xff1f; 介绍小程序的特点与适用场景、对开发者的影响以及课程特色&#xff01;七月老师小程序进阶课《纯正商业应用——微信小程序实战》与《微信小程序商城构建全栈应用》已上线&#xff0c;全面进阶小程序&#xff01; 1-1 序&#xff1a;十几个…

pat-1136. A Delayed Palindrome (20) 模拟

本可以java大数就能搞定的问题 当时用java写完答案明明对了提交总是答案错误 很是无语 题意 任给我们一个数 让我们对这个数进行翻转相加 如果加和是个回文数 就找到了程序出口 如果不是继续迭代 输出过程 如果迭代10次没有找到就输出特定信息 分析 就是模拟高精度加…

[Leetcode][第309题][JAVA][最佳买卖股票时机含冷冻期][动态规划][压缩空间]

【问题描述】[中等] 【解答思路】 1. 动态规划 动态规划流程 第 1 步&#xff1a;设计状态 f[i]表示第 i 天结束之后的「累计最大收益」 第 2 步&#xff1a;状态转移方程 f[i][0]max(f[i−1][0],f[i−1][2]−prices[i]) f[i][1]f[i−1][0]prices[i] f[i][2]max(f[i−1][1]…

59 javabean的创建

在一个项目里定义一个java类 package srever;public class Users {private String username;private String password;public Users() {}public String getUsername() {return username;}public void setUsername(String username) {this.username username;}public String g…

IIS Express 无法启动

IIS Express 无法启动1. \.vs\config\applicationhost.config2. 打开.csproject 中把 <UseIIS> 改成 False ----------------------------------------------------------------------------------------------- 我上传的项目代码被同事下载之后使用iisexpress调试一直报…

[剑指offer]面试题第[63]题[Leetcode][第121题][JAVA][买卖股票的最佳时机][动态规划][暴力]

【问题描述】[简单] 【解答思路】 1. 暴力 时间复杂度&#xff1a;O(N^2) 空间复杂度&#xff1a;O(1) public class Solution {public int maxProfit(int prices[]) {int maxprofit 0;for (int i 0; i < prices.length - 1; i) {for (int j i 1; j < prices.leng…

60usebean创建实例对象

建立一个users的java类 package srever;public class Users {private String username;private String password;public Users() {}public String getUsername() {return username;}public void setUsername(String username) {this.username username;}public String getPas…

ROS学习笔记四:用C++编写ROS发布与订阅

一、创建并编译功能包 1.1 创建功能包 在工作空间的 src 目录下创建功能包&#xff1a; $ cd ~/dev/catkin_ws/src $ catkin_create_pkg chapter2_tutorials std_msgs roscpp 1.2 编译功能包 进入工作目录下编译全部功能包&#xff1a; $ cd ~/dev/catkin_ws/ $ catkin_make 如…

Levko and Permutation CodeForces - 361B 思维 数论

题意 对一个长度&#xff0c;最大值为n的排列 构造出其恰好有k个GCD(i,a[i])>1 的排列 n<1e5;分析 由于每个大于1的数与自己的gcd必然>1 所以构造大于1的gcd可以用i与i去构造 那么还有就是相邻的两个数的gcd必然等于1 任何数与1的gcd都等于1 所以让k个数 从2开始…

[Leetcode][第315题][JAVA][计算右侧小于当前元素的个数][暴力][归并排序+索引数组]

【问题描述】[中等] 【解答思路】 1. 暴力 &#xff08;超时&#xff09; 时间复杂度&#xff1a;O(N^2) 空间复杂度&#xff1a;O(1) public List<Integer> countSmaller(int[] nums) {List<Integer> ans new ArrayList<Integer>();int n nums.length…

61setproperty对象

建立一个users类 package srever;public class Users {private String username;private String password;public Users() {}public String getUsername() {return username;}public void setUsername(String username) {this.username username;}public String getPassword(…

ansible-plabybook 常用的有用的命令

ansible-plabybook 常用的有用的命令 ansible-playbook常用的非常有用的参数有&#xff1a; -C &#xff0c;大写c &#xff0c;这个命令的意思就是模拟执行&#xff0c;会告诉你跑完这个playbook会发生什么&#xff0c;其实并没有真实发生 ansible-playbook -C web.yml –step…

关于sin的导数的证明

引自JetTangs的博客 几何证明: AC切圆O于C AO交圆O于B CD、OF为水平线 BF为垂直线 令∠EOF θ 求证sinθ的导数为cosθ 证: 设∠AOC的角度为x, 由弦切角定理可知∠ACB 12x 而且∠ECDθ 则∠BCD 90-θ-12x 于是 limx→0sin(90−θ−12x)cosθ意思就是 当x无限接近于…

[小技巧][JAVA]函数返回一个长度不确定的数组 (int[ ])

方法一&#xff1a;List转Int数组 &#xff08;逐个复制&#xff09; List<Integer> list new ArrayList<Integer>(); //LinkedList<Integer> list new LinkedList<Integer>();list.add(1);list.add(2);int count list.size();int[] aux new int[…

62 getproperty对象

定义一个login的jsp <% page language"java" import"java.util.*" contentType"text/html; charsetutf-8"%><!DOCTYPE html> <html> <head> <meta charset"ISO-8859-1"> <title>Insert title he…

Python网络爬虫之图片懒加载技术、selenium和PhantomJS

引入 今日概要 图片懒加载seleniumphantomJs谷歌无头浏览器知识点回顾 验证码处理流程今日详情 动态数据加载处理 一.图片懒加载 什么是图片懒加载&#xff1f; 案例分析&#xff1a;抓取站长素材http://sc.chinaz.com/中的图片数据 #!/usr/bin/env python # -*- coding:utf-8 …