Java 的 String 类基本用法介绍:http://www.runoob.com/java/java-string.html
Java 的 String.substring 函数:https://beginnersbook.com/2013/12/java-string-substring-method-example/
Google coding style:https://google.github.io/styleguide/javaguide.html
String 不支持下标索引的方式访问,所以需要使用charAt(i)的方式访问对应位置的字符。同时也就没有办法使用下标的方式对String进行修改。
String是一种不可变类,字符串一但生成就不能被改变。例如我们使用**‘+’进行字符串连接,会产生新的字符串,原串不会发生任何变化;使用replace()** 进行替换某些字符的时候也是产生新的字符串,不会更改原有字符串。
https://leetcode.com/problems/valid-palindrome/submissions/
1 class Solution { 2 public boolean isValid(char c){ 3 return (Character.isLetter(c) || Character.isDigit(c)); 4 } 5 6 public boolean isPalindrome(String Ss) { 7 String s=Ss.toLowerCase(); 8 int sl=s.length(); 9 int xl=0, xr=sl-1; 10 boolean res=true; 11 while(xl<xr){ 12 while(xl<sl && (!isValid(s.charAt(xl)))) xl+=1; 13 while(xr>=0 && (!isValid(s.charAt(xr)))) xr-=1; 14 if(xr<0 || xl>=sl) 15 break; 16 if(s.charAt(xl)!=s.charAt(xr)){ 17 res=false; 18 break; 19 } 20 xl+=1; 21 xr-=1; 22 } 23 return(res); 24 } 25 }
Rabin-Karp Algorithm:在字符串中找子串
算法原理:
Ref: https://www.jianshu.com/p/68cbe955103e
https://leetcode.com/problems/implement-strstr/
1 class Solution { 2 public int MOD=1000000; 3 public int INC=31; 4 public int strStr(String src, String dsc) { 5 if(src==null || dsc==null) 6 return -1; 7 int dl=dsc.length(), sl=src.length(); 8 if(dl==0) 9 return 0; 10 11 int power=1; 12 for(int i=0;i<dl;i++) 13 power=(power*INC)%MOD; 14 15 int dschash=0; 16 for(int i=0;i<dl;i++) 17 dschash = (dschash*INC + dsc.charAt(i)) % MOD; //hash code of dsc 18 19 int srchash=0; 20 for(int i=0;i<sl;i++){ 21 srchash = (srchash*INC + src.charAt(i)) % MOD; //calculate hash of src 22 if(i<dl-1) 23 continue; 24 else if(i>=dl){ 25 srchash = srchash - (src.charAt(i-dl) * power) % MOD; 26 while(srchash<0) 27 srchash += MOD; 28 } 29 if(srchash == dschash){ //hash(src[i-m+1..i]) == hash(dsc) 30 if(src.substring(i-dl+1, i+1).equals(dsc)) 31 return(i-dl+1); 32 } 33 } 34 35 return(-1); 36 } 37 }
子数组与前缀和
https://leetcode.com/problems/maximum-subarray/
使用前缀和,令p[i]=sum{ A[0]...A[i-1] }(p[0]=0,这个是为了方便后面计算用),那么就有sum{A[i]...A[j]} = p[j+1]-p[i]
设f[j]表示所有以A[j]结尾的子数组中最大的subarray,那么就有f[j] = p[j+1] - min{ p[0]...p[j] }
单纯的计算某个f[j]的时间复杂度是O(N)的,但其实计算好f[j]后,可以用O(1)的时间再计算出f[j+1]。所以整体的时间复杂度仍然是O(N)的。
1 class Solution { 2 public int maxSubArray(int[] nums) { 3 int nl=nums.length; 4 int[] prefix=new int[nl+1]; 5 prefix[0]=0; 6 for(int i=1;i<nl+1;i++) 7 prefix[i]=prefix[i-1]+nums[i-1]; 8 9 int[] f=new int[nl]; 10 int minp=0; 11 12 for(int i=0;i<nl;i++){ 13 minp=Math.min(minp, prefix[i]); 14 f[i]=prefix[i+1]-minp; 15 } 16 17 int ans=f[0]; 18 for(int i=1;i<nl;i++) 19 ans=Math.max(ans, f[i]); 20 return(ans); 21 } 22 }
https://www.lintcode.com/problem/subarray-sum/description
Q:找和为0的subarray
A:求出prefix[],用hashmap找里面相等的元素。O(N)
https://www.lintcode.com/problem/subarray-sum-closest/description
Q:找和最接近0的subarray
A:求出prefix[],找prefix[]中最接近的两个元素(排序)。 O(NlogN)
其他
UNDER CONSTRUCTION
https://leetcode.com/problems/subsets/
https://leetcode.com/problems/subsets-ii/