leetcode-字符串总结

leetcode-344-反转字符串(reverse string)-java
字符串是一个整体,如果对字符串内部进行操作,可以用stringbuilder,也可以将string转为char数组,这个方法更为灵活
反转的方式可以使用双指针,在前后两头逐个交换,交换后begin++,end–
交换的时候可以使用O(1)空间存储,也可以像这样使用亦或交换

leetcode-7-反转整数(reverse integer)-java
判断一个数是不是超出自己类型的范围,比如int,long等,可以用integer.maxvalue等,也可以对它进行运算,如果不正常就是溢出了
也可以在每次ans * 10 + pop之前,校验大小
当出现 ans > MAX_VALUE / 10 且 还有pop需要添加 时,则一定溢出
当出现 ans =MAX_VALUE / 10 且 pop > 7 时,则一定溢出,7是2^31 - 1的个位数
当出现 ans < MIN_VALUE / 10 且 还有pop需要添加 时,则一定溢出
当出现 ans =MAX_VALUE / 10 且 pop < -8 时,则一定溢出,8是-2^31的个位数

对数字类型颠倒,可以用乘除10,结果每次乘10+数字mod10

leetcode-387-字符串中的第一个唯一字符(first unique character in a string)-java
找重复的东西可以用hashmap,如果对查找顺序有要求可以用linkedhashmap,如果对象是固定的比如全是数字,字母,可以用int数组

有两种模式,
第一种key为字母,value为字母出现的次数,
这种适用于找到每个字母出现几次的情况
如果要找到只出现n次的字母,遍历map找到value=n既可,
如果要找到第n个出现k次的字母,遍历字符串,遍历的时候查找对应的value=k既可。

第二种key为字母,value为字母出现的index
这种情况一般适用于区分字母出现0次,1次,>1次的情况,
如果要找到出现第n个出现1次或者>1次的字母,遍历map既可

leetcode-242-有效的字母异位词(valid anagram)-java
注意:一定要先检查一个情况:两者的length是否相同,不然时间会变长!
典型的重复检测的图,由于限定26位小位数字母,直接用int【26】,否则用hashmap
s每有一个字母对应的int[i]加一个,同时t对应的减少一个
最后查是否全为0

leetcode-125-验证回文串(valid palindrome)-java
使用双指针,从前端和后端,挨个找到符合要求的字母
判断是否是数字和英文字符 . Character.isLetterOrDigit
字母的小写化 Characte.toLowerCase
(注意:这个方法A会变成a,其他的a,0,的放进去,不变)

leetcode-8-字符串转整数 (atoi)(String to Integer)-java
如果从字符串转为数字,由于不知道长度,可能会超出范围,
第一种方法,new BigInteger(str),再用这个biginteger与数字的范围比较

BigInteger resultlong=new BigInteger(result);
if(resultlong.compareTo(new BigInteger(String.valueOf(Integer.MIN_VALUE)))==-1){
		return Integer.MIN_VALUE;
	}

第二种方法,比如int,先检测length是否大于9,否则转为long,因为此时必定在long范围内,再与integer.max_value比较,即可
第三种方法,也可以在每次ans * 10 + pop之前,校验大小
当出现 ans > MAX_VALUE / 10 且 还有pop需要添加 时,则一定溢出
当出现 ans =MAX_VALUE / 10 且 pop > 7 时,则一定溢出,7是2^31 - 1的个位数
当出现 ans < MIN_VALUE / 10 且 还有pop需要添加 时,则一定溢出
当出现 ans =MAX_VALUE / 10 且 pop < -8 时,则一定溢出,8是-2^31的个位数

leetcode-28- 实现strStr()(implement strstr)-java
查询字符串中另一个字符串的位置时可以说使用kmp算法,原来速度o(nm),现在o(n+m)

leetcode-38-报数 (count and say)-java
循环n次,每次查询下一个数,由于数可能很大,必须用string字符串作为参数和结果
在查询下一个数中,循环这个数的长度次,每次与上一个字符判断是否相同,相同,则num++,否则结果插入num和prev,为几个谁,然后prev和num重置。最后,i==length,则由于没有下一位进行比较,直接插入num,prev

leetcode-14-最长公共前缀(longest common prefix)-java
具体方法是先算出所有字符串的最小长度,在最小长度内循环
每次取第一个字符串的对应字符作基准,如果后面的都与他相同,则小循环后,最后一个对应的字符的index++,返回时直接substring即可

leetcode-49-字母异位词分组(group anagrams)-java
算法的关键是:如何将多个字母异位词定位到一个分类,即类似与hash(a)=hash(b)
这里的方法是,将字符串转为char数组,根据字母大小排序,再转为字符串,得到它的hashcode
建立一个hashmap,key为字符串对应的hashcode,value为result里字符串对应的index
字符串最后加入index对应的那个list中去

一种是,char数组排序后,生成的字符串作为hash的结果(不对这个生成的字符串hashcode)
另一种是,用int[26]统计字符串的字母的个数,用字符串 1#2#3… 作为hash的结果,其中的1就代表a的个数,其他类似

leetcode-3-无重复字符的最长子串(longest substring without repeating characters)-java
滑动窗口法类似于双指针,两个指针一个对应窗口的开始,一个对应结束。
每次移动窗口到j(结束),根据j的内容,将i指针(开始)移动到对应位置。
一般是一步步移动i指针,但如果在map中存放了value为对应index的数据,可能可以直接将i指针移动到确定位置

优化的滑动窗口
它可以被进一步优化为仅需要 n 个步骤。我们可以定义字符到索引的映射,而不是使用集合来判断一个字符是否存在。 当我们找到重复的字符时,我们可以立即跳过该窗口。
也就是说,如果 s[j]在 [i,j) 范围内有与 j′ 重复的字符,我们不需要逐渐增加 i。 我们可以直接跳过 [i,j′] 范围内的所有元素,并将 i变为 j′+1。

leetcode-5-最长回文子串(longest palindromic substring)-java
使用manacher算法
https://blog.csdn.net/xushiyu1996818/article/details/100533618

leetcode-76-最小覆盖子串-java
明显是要使用滑动窗口,比较复杂的一点是,滑动窗口的长度是可变的。
所以区别于固定滑动窗口的达到窗口长度后随着右指针向右移动一位左指针也要移动一位
滑动窗口更改长度的原因是在滑动窗口中去掉不需要的字符
使用数组hash存储需要的字符串,根据字符串t,里面hash[ tt[i] -‘0’]++,需要的字符为正数,不需要的为0或者负数。
使用count记录匹配的字符数,一开始为t.length,如果为0,代表完全匹配,刷新minLength和results
right每次向右移动一位,hash[ ss[right] -‘0’]- - ,表示需要的字符数减少,如果hash[ ss[right] -‘0’]>=0 代表right是需要的字符。
然后不断让left向右移hash[ ss[left] -‘0’]<0 ,代表left是不需要的字符,自然可以向右移。
最后判断count是否为0

你可能感兴趣的:(数据结构-字符串,leetcode,leetcode总结)