字符串
字符串
爱抖腿的嘻嘻嘻
这个作者很懒,什么都没留下…
展开
-
回文子串数量
求一个字符串有多少个回文子串 最朴素的方法就是列举出所有的回文子串 如果列举出所有的子串再判断它是不是回文串,那需要O(n3) 但如果枚举每个中心,扩展的判断以其为中心的子串是不是回文,则需要O(n2) 那如何有序的枚举所有的中心,因为中心可能是单数的,也可能是双数的,列举发现n个长度的子串产生的扩展中心单数加双数有2n-1组 每一个i可以产生一组下标[l,r],如果l和r一样则说明奇数,如果l和r不一样,则说明他们是两个相挨的下标。 所以一个i可以得到的两个下标为i/2和i/2+(imod2) 如果这个没原创 2021-03-03 03:33:32 · 202 阅读 · 0 评论 -
字符串解码
本题中可能出现括号嵌套的情况,比如 2[a2[bc]],这种情况下我们可以先转化成 2[abcbc],在转化成 abcbcabcbc。我们可以把字母、数字和括号看成是独立的 TOKEN,并用栈来维护这些 TOKEN。具体的做法是,遍历这个栈: 如果当前的字符为数位,解析出一个数字(连续的多个数位)并进栈 如果当前的字符为字母或者左括号,直接进栈 如果当前的字符为右括号,开始出栈,一直到左括号出栈,出栈序列反转后拼接成一个字符串,此时取出栈顶的数字(此时栈顶一定是数字,想想为什么?),就是这个字符串应该出现的原创 2021-02-24 21:11:44 · 91 阅读 · 0 评论 -
字母异位词分组
给一些有可能字母相同的异位词组,将字母相同的放到同一组中 所以创建一个map,以每个字符串排序之后的值作为键,将以这个字符串为键的词的数组作为词。最后将所有values转为list class Solution { public List<List<String>> groupAnagrams(String[] strs) { Map<String,List<String>> map=new HashMap<String,List原创 2021-02-03 11:26:09 · 78 阅读 · 1 评论 -
单调栈3.拼接最大数
与从一个数组中去除k个数类似,只不过现在是从两个数组中选k个数使其最大,不能改变相对位置,所以需要归并(在未排序的数组中归并) 也就是分别在第一个数组中选k1个数,在第二个数组中选k2个数,然后将他们组合成一个最大的数。分成归和并两步。 选k1个数就利用单调栈来选,选出来是一个单调递减的数组,归并就利用哪个大归并哪个来做。 那怎么确定哪个数组选几个呢,如果第一个数组的长度为m。第二个数组的长度为n,那么k1要大于0小于m,k2要大于0小于n,k1+k2=k,需要遍历所有x和y可能的值。k2等于k-k1,所以原创 2021-01-21 16:37:24 · 73 阅读 · 0 评论 -
单调栈2.去除重复字母
去除字符串中的重复字母,并使得剩下的字符串的字典序最小。 仍然类似于去掉k个字母,但此题没有k,而是换成了重复字母的个数,每一个字母都有一个次数。可以先用一个哈希表来记录这种关系。 但遍历完成后不能知道有哪些字母没有被除干净,也不能向去除k个数字一样去掉后面的,所以只能换一种方法。 设置一个map来表示每个字母出现的次数。 设置一个exist数组来表示此时的字符是否已经加入过栈,任何时候栈中只能出现一个字母的一次。 如果没有加入过,则可加入,如果加入过,就直接跳过,并让这个字母出现的次数-1(也就是后面还会原创 2021-01-20 22:12:48 · 101 阅读 · 0 评论 -
单调栈1.去掉k位数字使剩下的数字最小
核心就是贪心 ,优先丢弃前面的使得满足要求。 保持字符串相对位置不变的去字符比大小题 去掉k位数字使剩下的数字最小 我们需要去掉k个数并使剩下的数字最小。 所以思路就是遍历数组,面对每一个数字都选择去掉或是保留,因为两个相同位数的数字比较就是通过第一个不同的数字来比较的。 利用单调栈来保存留下的的数字,对这个题来说是单调递增栈,因为前面的数字越小,会使得留下的数字越小,所以要优先把前面大的数字去掉。 使用单调栈, 1.如果当前元素小于栈顶元素,则将栈顶元素出栈(因为保留当前这个元素更好)每丢弃一次都使得k减原创 2021-01-20 20:01:46 · 202 阅读 · 0 评论 -
栈2.基本计算器
处理一个字符串,计算这个字符串的值,符号有加号,减号,空格,括号 本质上处理字符串就是要延迟主表达式的处理过程,优先计算括号内的表达式 将元素一个个的添加到栈里,直到遇到一个右括号,这时优先计算这个括号内的内容,所以要弹出栈中的内容直到遇到左括号。在计算的过程中,由于所有的数都是逆向弹出的,所以不好计算其中的减法,我们需要把所有的计算都看成加法,把减法看成负数。 当迭代遇到一个数字时,要将此数字加上之前得到的操作数乘10 当迭代遇到一个+或者-时,就将上一个操作数以及符号计算到结果中,然后将符号赋值给下次运原创 2021-01-20 17:51:18 · 86 阅读 · 0 评论 -
栈1.有效的括号
判断一个只包含三种括号的字符串是否符合括号规范。 如果括号顺序是正确的,那么用栈来保存括号,碰到左括号时入栈,碰到右括号时出栈,则遍历完成之后栈是空的。 是否正确不仅与括号的数量有关,还与括号的位置有关. map中key是)而value是(的原因是这样可以在碰到)的时候方便的判断它是否为对应的括号。 class Solution { public boolean isValid(String s) { if(s.length()%2==1)return false;原创 2021-01-20 14:39:46 · 78 阅读 · 0 评论 -
划分字母区间
要找到最多的片,且每个字母最多出现在同一个字符串中,所以一个片段的开始的字母肯定等于最后的字母,要让片数最多,则片段之间的距离要尽可能短。 首先利用遍历找到每个字母的最后位置,然后再次利用双指针维护此时片段的开始和结束位置。然后读取当前位置字母的结束值,end等于读取过字母中最远距离的end,但一旦到达这个end,相对于其他片段来说已经是最短了。完成这个片段,后面进行下一个片段的读取。 class Solution { public List<Integer> partitionLabe原创 2021-01-16 18:28:38 · 78 阅读 · 0 评论 -
Z字形变换(按行来读取以列排列的字符串)
因为给的字符串是以n行的倒z字按列排列的,现在要按行读,那就可以先读出每一行,然后将所有行拼在一起,但读的时候还是按原来的顺序按列读,只不过是分到不同的行。 因为是按倒z字排列,所以每当读到第一行和最后一行的时候就要改变分配行的方向,利用一个flag就可以实现当前分配行是加还是减。 import java.util.ArrayList; class Solution { public String convert(String s, int numRows) { if(s==null原创 2021-01-16 12:04:55 · 228 阅读 · 1 评论 -
判断字符串是否表示数值
判断字符串是否表示数值 这种字符串判断的题就很考验完整性的把握,因为有很多种情况,需要考虑。 数值包括整数和小数,遵循A[.[B]][e|EC]或者.B[e|EC] A为帧数部分,B为小数部分,C紧跟着E或者e表示小数部分。一个数可以没有整数部分,那一定有小数部分。 然后A和C都是可以以+或-开头的0到9的数位串 扫描模式就是先扫描A,如果遇到小数点开始扫描B,如果遇到E或者e,开始扫描C.而扫描A和C都可以看成是有符号整数,B用的是无符号整数,无符号整数要确保它一定存在,也就是i要移动过。 记得i要作原创 2020-11-17 11:20:46 · 209 阅读 · 0 评论 -
改变2.替换空格
替换空格 实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。 将字符串进行替换,输入的是StringBuffer 如果是java的话就直接转换为String然后利用replace函数,但这样肯定是不行的。 第二种思路就是新建一个StringBuffer,然后遍历原字符串getchar(i),如果是空格就跳过并且将%20加入到新的StringBuffer中,这种比较简单,但一般不建议创建一个新的字符串,建原创 2020-10-30 09:44:38 · 61 阅读 · 0 评论 -
字符串排列组合(可用回溯)
字符串的排列 求出整个字符串的排列以及字典序排列。第一步找出所有的,第二步排序。 可以利用递归的思想,分成第一个字符和后面字符的全排列。求整个字符串的排列,第一步就是把第一个字符和后面的所有字符交换一次,第二步是递归求解后面字符串的全排列。 拿到一个字符串,首先将第一个与第二个交换,然后将交换后的传入继续交换接下来的,也就是此时第一个已经固定了,求的是剩下的字符串的全排列,需要知道一个起始点。递归回来之后再将这个换回来,继续令第一个字符和第三个字符交换。。。 怎么判断是否重复,那就要在交换前判断这个字符是否原创 2020-11-29 15:11:34 · 496 阅读 · 0 评论 -
改变1.翻转字符串
翻转单词顺序 反转单词顺序但单词内部顺序不变 思路就是先翻转所有的字符然后再翻转每个单词中字符的顺序。 public class Solution { public String ReverseSentence(String str) { if(str==null || str.length()==0) return ""; char[] c=str.toCharArray(); reverse(c,0,c.length-1); int原创 2020-12-11 10:59:42 · 65 阅读 · 0 评论 -
滑动窗口--无重复字符的最长子串3
可以知道子串和子序列的区别 所以子串一定是连续子串。 所以很容易想到滑动窗口法。因为求的是最长无重复字符子串,所以得维护一个set来保存此时其中的元素个数。 因为是查找最长序列,所以直接用charAt就可以找到,不用输出字符串,也不用改变,用字符串就行,不用转成字符数组。 然后想这个的窗口方式,首先不是固定窗口,然后想这个题的滑动方式,如果把start看成一个字符串的开始,end表示子串的结束,遍历所有start就是遍历以所有字符开头的子串,然后在看其中某一个start开头的子串时,如果他的结束到了end,原创 2020-12-17 18:49:34 · 60 阅读 · 0 评论