package y2019.Algorithm.str.hard;

import java.util.Stack;

/**
* @ProjectName: cutter-point
* @Package: y2019.Algorithm.str.hard
* @ClassName: LongestValidParentheses
* @Author: xiaof
* @Description: 32. Longest Valid Parentheses
*
* Given a string containing just the characters '(' and ')', find the length of the longest valid (well-formed) parentheses substring.
*
* Example 1:
*
* Input: "(()"
* Output: 2
* Explanation: The longest valid parentheses substring is "()"
* Example 2:
*
* Input: ")()())"
* Output: 4
* Explanation: The longest valid parentheses substring is "()()"
*
* 求最长有效括号对,那么就是要确保子串是连续
* @Date: 2019/8/6 9:51
* @Version: 1.0
*/
public class LongestValidParentheses { public int solution(String s) {
//用来统计最大的括号数,我们只要能匹配成功就行
Stack<Integer> stack = new Stack();
char[] ss = s.toCharArray();
int n = ss.length, res = 0; //遍历
for (int i = 0; i < ss.length; ++i) {
if (ss[i] == '(') {
stack.push(i); //用来存放int位置
} else {
if (!stack.isEmpty()) {
//如果不为空,那么就可以进行匹配
if (ss[stack.peek()] == '(') stack.pop();
else stack.push(i);
} else {
stack.push(i);
}
}
}
//我们只需要统计剩下无法匹配的连续的(的数据比较就可以了
//如果栈为空,那么正好完全匹配
if (stack.isEmpty()) {
res = n;
} else {
//如果不是完全匹配,那么就要计算连续两个(的间隔
int r = n, l = 0;
while (!stack.isEmpty()) {
//不断获取最后的结束符号位置
l = stack.pop();
//取最长的串位置
res = Math.max(r - l - 1, res);
r = l; //更新位置
}
//最后还要判断从起始位置开始到当前位置消掉的长度
res = Math.max(r, res);
}
return res;
}
}
package y2019.Algorithm.str.hard;

/**
* @ProjectName: cutter-point
* @Package: y2019.Algorithm.str.hard
* @ClassName: MinDistance
* @Author: xiaof
* @Description: 72. Edit Distance
* Given two words word1 and word2, find the minimum number of operations required to convert word1 to word2.
*
* You have the following 3 operations permitted on a word:
*
* Insert a character
* Delete a character
* Replace a character
* Example 1:
*
* Input: word1 = "horse", word2 = "ros"
* Output: 3
* Explanation:
* horse -> rorse (replace 'h' with 'r')
* rorse -> rose (remove 'r')
* rose -> ros (remove 'e')
* Example 2:
*
* Input: word1 = "intention", word2 = "execution"
* Output: 5
* Explanation:
* intention -> inention (remove 't')
* inention -> enention (replace 'i' with 'e')
* enention -> exention (replace 'n' with 'x')
* exention -> exection (replace 'n' with 'c')
* exection -> execution (insert 'u')
* @Date: 2019/8/7 11:42
* @Version: 1.0
*/
public class MinDistance { public int solution(String word1, String word2) {
int w1 = word1.length(), w2 = word2.length();
char w1s[] = word1.toCharArray(), w2s[] = word2.toCharArray();
int[][] dpcost = new int[w1 + 1][w2 + 1]; //初始化
for (int i = 0; i <= w1; ++i) {
dpcost[i][0] = i; //标识要把word1的i个字符化为0个,那就删i次
}
for (int j = 0; j <= w2; ++j) {
dpcost[0][j] = j;
}
//这题动态规划了,比较复杂说实话 //遍历
for (int i = 1; i < dpcost.length; ++i) {
for (int j = 1; j < dpcost[i].length; ++j) {
//我们把动态规划递增的量设置为,word1前i个字符,转换为word2前j个字符需要的最小操作数
//f(i,j) = f(i-1, j-1) 当word1[i] == word2[j]的时候,相等字符,那么当前字符就不需要花费操作次数
if (w1s[i - 1] == w2s[j - 1]) {
dpcost[i][j] = dpcost[i - 1][j - 1];
} else {
//当word1[i] != word2[j]的时候 分三种情况平衡
//1.进行插入操作, 那就是新增一个一样的字符和word2进行匹配,那就是word2的j位就直接新增进去,就不用比较了,我们取没有j号的次数
// f(i,j) = f(i, j-1) + 1;
int insert = dpcost[i][j - 1];
//2.当进行删除操作,那就是把word1当前字符删除掉,当前位置相当于不比较
// f(i,j)=f(i-1,j) + 1;
int remove = dpcost[i - 1][j];
//3.当进行替换操作,那就是把当前字符完全替换,那么就是新增一个操作,其余和之前一样
// f(i,j)=f(i-1,j-1) + 1;
int replace = dpcost[i - 1][j - 1]; dpcost[i][j] = Math.min(insert, Math.min(remove, replace)) + 1;
}
}
} return dpcost[w1][w2]; }
}
package y2019.Algorithm.str.hard;

import java.util.HashMap;
import java.util.Map; /**
* @ProjectName: cutter-point
* @Package: y2019.Algorithm.str.hard
* @ClassName: MinWindow
* @Author: xiaof
* @Description: 76. Minimum Window Substring
* Given a string S and a string T, find the minimum window in S which will contain all the characters in T in complexity O(n).
*
* Example:
*
* Input: S = "ADOBECODEBANC", T = "ABC"
* Output: "BANC"
* Note:
*
* If there is no such window in S that covers all characters in T, return the empty string "".
* If there is such window, you are guaranteed that there will always be only one unique minimum window in S.
* @Date: 2019/8/7 15:15
* @Version: 1.0
*/
public class MinWindow { public String solution(String s, String t) {
if (s == null || t == null || s.length() < t.length() || s.length() == 0 || t.length() == 0) {
return "";
}
//用索引,并且是单次循环
int l = 0, r = 0, count = t.length(), minle = s.length(), minl = 0, minr = 0;
Map<Character, Integer> map = new HashMap();
boolean pipeiok = false;
//第一次循环,初始化map
for (int i = 0; i < t.length(); ++i) {
map.put(t.charAt(i), map.getOrDefault(t.charAt(i), 0) + 1);
} //循环遍历字符串
while (r < s.length()) {
//计算是否存在所有字符的子串
char curc = s.charAt(r);
if (map.containsKey(curc)) {
//如果包含
map.put(curc, map.get(curc) - 1);
if (map.get(curc) >= 0) {
//如果有效匹配
--count;
}
} //如果全部匹配完成,存在单字符匹配
while (count == 0 && l <= r) {
pipeiok = true;
int curlen = r - l + 1;
if (curlen <= minle) {
//存在更小值
minl = l;
minr = r;
minle = curlen;
} //更新最左边索引
char leftc = s.charAt(l);
if (map.containsKey(leftc)) {
//如果包含,那么就找到了最左边的第一个字符
//我们把这个位置的字符剔除掉,然后看是否可以找到更小的子串
map.put(leftc, map.get(leftc) + 1);
if (map.get(leftc) >= 1) {
//加一之后恢复到正常状态
count++;
}
}
//吧最左边右移一次
l++;
}
r++; //往后遍历
} return pipeiok == true ? s.substring(minl, minr + 1) : "";
} public static void main(String[] args) {
String s[] = {"ADOBECODEBANC", "ABC"};
String s1[] = {"aa", "aa"}; MinWindow fuc = new MinWindow(); fuc.solution(s1[0], s1[1]); }
}

【LEETCODE】66、字符串分类,hard级别,题目:32,72,76的更多相关文章

  1. 前端与算法 leetcode 8. 字符串转换整数 (atoi)

    目录 # 前端与算法 leetcode 8. 字符串转换整数 (atoi) 题目描述 概要 提示 解析 解法一:正则 解法二:api 解法二:手搓一个api 算法 传入测试用例的运行结果 执行结果 G ...

  2. Leetcode中字符串总结

    本文是个人对LeetCode中字符串类型题目的总结,纯属个人感悟,若有不妥的地方,欢迎指出. 一.有关数字 1.数转换 题Interger to roman和Roman to integer这两题是罗 ...

  3. LeetCode:颜色分类【75】

    LeetCode:颜色分类[75] 题目描述 给定一个包含红色.白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色.白色.蓝色顺序排列. 此题中,我们使用整数 ...

  4. LeetCode:字符串的排列【567】

    LeetCode:字符串的排列[567] 题目描述 给定两个字符串 s1 和 s2,写一个函数来判断 s2 是否包含 s1 的排列. 换句话说,第一个字符串的排列之一是第二个字符串的子串. 示例1: ...

  5. 前端与算法 leetcode 387. 字符串中的第一个唯一字符

    目录 # 前端与算法 leetcode 387. 字符串中的第一个唯一字符 题目描述 概要 提示 解析 解法一:双循环 解法二:Set法单循环 算法 传入测试用例的运行结果 执行结果 GitHub仓库 ...

  6. 前端与算法 leetcode 66. 加一

    目录 # 前端与算法 leetcode 66. 加一 题目描述 概要 提示 解析 解法一 解法二 算法 # 前端与算法 leetcode 66. 加一 题目描述 给定一个由整数组成的非空数组所表示的非 ...

  7. LeetCode:字符串相加【415】

    LeetCode:字符串相加[415] 题目描述 给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和. 注意: num1 和num2 的长度都小于 5100.num1 和num2 都只 ...

  8. PTA数据结构与算法题目集(中文) 7-6

    PTA数据结构与算法题目集(中文)  7-6 7-6 列出连通集 (25 分)   给定一个有N个顶点和E条边的无向图,请用DFS和BFS分别列出其所有的连通集.假设顶点从0到N−1编号.进行搜索时, ...

  9. 2017-3-7 leetcode 66 119 121

    今天纠结了一整天============================================================== leetcode66 https://leetcode.c ...

随机推荐

  1. Django 基础篇(一)

    创建虚拟环境 创建:mkvirtualenv [虚拟环境名称] 删除:rmvirtualenv [虚拟环境名称] 进入:workon [虚拟环境名称] 退出:deactivate 所有的虚拟环境,都位 ...

  2. loj2058 「TJOI / HEOI2016」求和 NTT

    loj2058 「TJOI / HEOI2016」求和 NTT 链接 loj 思路 \[S(i,j)=\frac{1}{j!}\sum\limits_{k=0}^{j}(-1)^{k}C_{j}^{k ...

  3. 中国大学生计算机系统与程序设计竞赛 CCF-CCSP-2017 串行调度(serial)

    串行调度(serial) 除等价条件, 根据题意设置限制条件,然后求字典序最小拓扑序. 简洁版 #include<bits/stdc++.h> using namespace std; ; ...

  4. 【LG2154】[SDOI2009]虔诚的墓主人

    [LG2154][SDOI2009]虔诚的墓主人 题面 洛谷 题解 如果您没有看懂题,请反复阅读题面及样例 可以发现,对于某一个点,它的答案就是上下左右几个组合数乘起来. 这样直接做复杂度显然爆炸,考 ...

  5. NSGA-II算法学习

    什么是支配: 支配就是统治,在各方面都优于其余个体 如个体i支配个体j,就说明个体i在所有目标函数的表现上都不差于个体j,并且至少在一个目标上优于个体j: 什么是非支配: 非支配就是个体在种群中是最优 ...

  6. NULL与nullptr

    [https://blog.csdn.net/weixin_40237626/article/details/82560012] 其实啊,在编译器进行解释程序时,NULL会被直接解释成0,所以这里的参 ...

  7. [技术博客] gitlab快速部署流程

    这里直接贴出少昂的个人博客链接:https://www.cnblogs.com/HansBug/p/9813627.html

  8. asp.netCore3.0区域和路由配置变化

    一.MVC 服务注册 ASP.NET Core 3.0 添加了用于注册内部的 MVC 方案的新选项Startup.ConfigureServices.三个新的顶级扩展方法与 MVC 方案上IServi ...

  9. hyper-v显示分辨率如何自动调整

    打开文件/etc/default/grub 找到GRUB_CMDLINE_LINUX_DEFAULT所在行,在最后加上 video=hyperv_fb:[分辨率],比如我想要的分辨率是1600×900 ...

  10. 信息系统项目十大管理ITO

    这是份关于信息系统项目管理师教程的内容提炼而成的电子文档,帮助所有备考信息系统管理师的考生准备,让大家快速记忆,助考加速.闲话少叙:直接上传我自己提炼的知识点.下图只是一部分,附件是所有内容.下载链接 ...