zoukankan      html  css  js  c++  java
  • Leetcode Lect1 String相关题目

    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/

  • 相关阅读:
    原生JavaScript事件详解
    如何真正重写window对象的方法
    JSLint JavaScript代码质量审查工具汉化中文版隆重发布
    {{偷偷告诉你}}本博客已适配移动端浏览
    谷歌(Chrome)浏览器调试JavaScript小技巧
    小米Web前端JavaScript面试题
    根据配置文件加载js依赖模块(JavaScript面试题)
    中移杭州研发中心
    MyBatis与Hibernate区别
    hashmap源码解析,JDK1.8和1.7的区别
  • 原文地址:https://www.cnblogs.com/pdev/p/11163685.html
Copyright © 2011-2022 走看看