算法
Ficca
这个作者很懒,什么都没留下…
展开
-
最小覆盖子串
算法框架:/* 滑动窗口算法框架 */void slidingWindow(string s, string t) { unordered_map<char, int> need, window; for (char c : t) need[c]++; int left = 0, right = 0; int valid = 0; while (right < s.size()) { // c 是将移入窗口的字符 .原创 2020-08-17 16:37:22 · 157 阅读 · 0 评论 -
中缀转后缀-example
下面以a+bc+(de+f)*g为例子来讲讲计算机的转换过程。下面在描述栈的情况是直接用文字描述了,由左到右为栈底到栈顶。空表示栈空由左向右遍历表达式,首先遇到a,直接将其输出。此时输出为:a栈的情况为:空继续遍历,遇到+,将其放入栈中。此时输出为:a栈的情况为:+继续遍历,遇到b,直接将其输出。此时输出为:ab栈的情况为:+继续遍历,遇到*,因为的优先级大于栈顶的+,所以将放入栈内。此时输出为:ab栈的情况为:+*继续遍历,遇到c,直接将其输出。此时输出为:abc栈的情况为:原创 2020-08-15 09:56:05 · 204 阅读 · 0 评论 -
斐波那契数列非递归解法
public static int fibonacci(int n) { if (n < 1) { return 0; } if( n == 1 || n == 2) { return 1; } int result = 1; int preResult = 1; // n - 2项 int current.原创 2020-08-01 17:25:53 · 521 阅读 · 0 评论 -
把字符串转换成整数
题目:需要考虑的是,这个数带不带符号,符号是"+" 还是”-“,可以通过字符串的第一个字符,使用flag记录一下这个符号,若没有符号,则从字符串头到字符串尾依次遍历,若有符号,则总第二个字符开始遍历,注意:在最后输出结果时,根据flag的记录,将符号恢复(若为”+“,则不用恢复)实现代码如下:package cn.strtoint;/** * @program: algorithm_learn * @description: 把字符串转换成整数 * @author: Mr.Luo * @原创 2020-06-11 14:29:51 · 142 阅读 · 0 评论 -
括号匹配深度
题目:思路:从第一个字符开始向后遍历,碰到’(’,count++,否则count–,max用于保存上一次循环中max和count的最大值具体实现如下:package cn.bracket;import java.util.Scanner;/** * @program: algorithm_learn * @description: 括号匹配深度 * @author: Mr.Luo * @create: 2020-06-11 10:39 */public class Main原创 2020-06-11 11:21:11 · 377 阅读 · 0 评论 -
最长回文子序列
题目:与最长回文子串不同,子序列是保持相对位置字符序列,而子串是连续的一个序列在最长回文子序列问题中,考虑使用DP在这个问题中,dp数组的定义是:在子串s[i…j]中,最长回文子序列的长度为dp[i][j]找状态转义需要归纳思维,说白了就是如何从已知的结果推出未知的部分,定义二维数组dp,容易归纳,容易发现状态转移关系我们想要求dp[i][j],若我们知道dp[i+1][j-1]的话,是不是就很容易了?当然,这取决于s[i]和s[j]的字符:如果他俩相等,那么他俩再加上s[i+1原创 2020-06-11 00:38:58 · 348 阅读 · 0 评论 -
最长回文子串
题目:解法一:暴力解法:找出该字符串的所有子串,判断回文串,取最大,这里不做演示解法二:时间复杂度为O(n^2)具体做法如下:以一个字符为中心,向左右扩展,如果左右字符相同,则继续扩展,否则,改变中心字符的位置,继续扩展操作在这个过程中,以i为指针,i可能在串s某个奇数子串的中间位置,也可能是串s某个偶数子串的偏左位置,因此,需要按照奇数和偶数的方案,对字符串遍历实现代码如下;package cn.palindrome;/** * @program: algorithm_lea原创 2020-06-10 20:33:06 · 98 阅读 · 0 评论 -
验证回文串
题目:思路很简单:直接从字符串首尾遍历,判断是否相等代码如下:package cn.palindrome;/** * @program: algorithm_learn * @description: 验证回文串 * @author: Mr.Luo * @create: 2020-06-10 12:42 */public class Solution_2 { public static boolean isPalindRome(String s){ if (s原创 2020-06-10 16:06:38 · 190 阅读 · 1 评论 -
构造最长回文串
题目:现在我们考虑一下可以构成回文串的两种情况:字符出现次数为双数的组合字符出现次数为双数的组合+一个只出现一次的字符思路:统计字符出现的次数即可,双数才能构成回文。因为允许中间一个数单独出现,比如"abcba”,所以如果最后有字母落单,总长度可以加1。首先将字符串转变为字符数组。然后遍历该数组,判断对应字符是否在hashset中,如果不在就加进去,如果在就让count++,然后移除该字符!这样就能找到出现次数为双数的字符个数。实现时注意临界特殊情况的考虑:比如在本题设计方法时,记得判原创 2020-06-09 23:06:54 · 420 阅读 · 0 评论 -
最长公共前缀
题目:其实思路很简单,先用Arrays.sort(strs)进行排序,然后将数组的第一个元素和最后一个元素的字符,从前往后比较即可代码如下;package cn.maxprefix;import java.util.Arrays;/** * @program: algorithm_learn * @description: 最长公共前缀 * @author: Mr.Luo * @create: 2020-06-09 21:06 */public class Main {原创 2020-06-09 22:34:13 · 160 阅读 · 0 评论 -
KMP算法简解
与暴力匹配最显著的区别是,在进行串的匹配时,主串P,模式串为S,某个字符不匹配的时候,i不变,j=next[j],从而避免的i指针的回溯,节省了时间开销对于next数组:当模式串中第j个字符匹配失败时,由前1~j-1个字符组成的串记为S,则next[j] = S 的最长相等前后子串的长度 + 1图解如下:挡第j个字符匹配失时,我们尝试将模式串后移,那么,移动多少呢?这时候,我们考虑前后缀的概念,如图,j=7时匹配失败,我们把前1~(k-1)个字符看做串S,实际上给,我们要做的,就是把最长前缀移动至.原创 2020-06-08 18:24:18 · 114 阅读 · 0 评论