• Java 字符串String(一)拆分


    在java语言中,String是一个包含char数组、其他字段,方法组成的java类。而在我们的coding生涯中,字符串又往往是我们最常也是最多打交道的,因此下面的一些常用的方法列举一下:

    toCharArray()//将此字符串转换为一个新的字符数组
    Arrays.sort()//对数组进行排序
    Arrays.toString(char[] a)//返回指定数组内容的字符串表示形式
    charAt(int index)//        //返回指定索引出的char值
    length()//返回此字符串的长度
    substring(int beginIndex)    //返回一个新字符串,是原字符串的子串
    substring(int beginIndex, int endIndex)//同上
    Integer.valueOf(String s)// 返回的是一个Integer对象
    String.valueOf(int i)//返回int参数的字符串表示形式

    接下来一个小问题:

    Given a string s and a dictionary of words dict, determine if s can be segmented into a space-separated sequence of one or more dictionary words.
    
    For example, given
    s = "leetcode",
    dict = ["leet", "code"].
    
    Return true because "leetcode" can be segmented as "leet code".

    1、拿到这个题目,我一想首先到脑子的是遍历,挨个遍历一番,把指定的字符串从0到length来一下,看看与字典是否一样,一样的话就从这个index到length再比较一下。如果一样,那么就OK

    下面是我自己写的搓搓的代码, 下面是调用的

     1 public boolean divisionString (String targetS, String[] dict){
     2         String temp = null;
     3         int tmpi =0;    //标识以及一部分匹配后,下一个的beginIndex
     4         for(int i=1; i<= targetS.length(); i++){
     5             if(tmpi == 0){
     6                 temp = targetS.substring(0, i);
     7             }else{
     8                 temp=targetS.substring(tmpi, i);
     9             }
    10             for(int j=0; j< dict.length; j++){
    11                 if(temp.equals(dict[j])){
    12                     tmpi=i;    //首次或者下次匹配后,next的beginIndex
    13                     break;
    14                 }
    15             }
    16         }
    17         if(tmpi == targetS.length()){    //最后tmpi肯定要等于要鉴定的字符串的长度咯
    18             return true;
    19         }else{
    20             return false;
    21         }
    22     }

    2、不过当我看到网页例子的时候他的解法可能要比我的好那么一点

    请看下面代码:

     1     public boolean wordBreak(String s, Set<String> dict) {
     2         boolean[] t = new boolean[s.length()+1];
     3         t[0] = true; //set first to be true, why?
     4         //Because we need initial state
     5  
     6         for(int i=0; i<s.length(); i++){
     7             //should continue from match position
     8             if(!t[i]) 
     9                 continue;
    10  
    11             for(String a: dict){
    12                 int len = a.length();
    13                 int end = i + len;
    14                 if(end > s.length())
    15                     continue;
    16  
    17                 if(t[end]) continue;
    18  
    19                 if(s.substring(i, end).equals(a)){
    20                     t[end] = true;
    21                 }
    22             }
    23         }
    24         return t[s.length()];
    25     }

    看了一下这个思路的重点是以dict的内容和长度来对字符串比较,切割字符串的次数比我上个代码少了很多,效率上来说的话,如果数据量大了的话应该会明显好,

    其实上面两个方法已经默认用到了Dynamic Programming方法,所以有时候algorithm这个东西又没有我们想的那么难

    3、题目给的最基本的做法是一个递归,这里也把代码贴过来吧, 其实我蛮不喜欢递归这个东东的!

     1         public boolean wordBreakNative(String s, Set<String> dict) {
     2                  return wordBreakHelper(s, dict, 0);
     3         }
     4      
     5         public boolean wordBreakHelper(String s, Set<String> dict, int start){
     6             if(start == s.length()) 
     7                 return true;
     8      
     9             for(String a: dict){
    10                 int len = a.length();
    11                 int end = start+len;
    12      
    13                 //end index should be <= string length
    14                 if(end > s.length()) 
    15                     continue;
    16      
    17                 if(s.substring(start, start+len).equals(a))
    18                     if(wordBreakHelper(s, dict, start+len))
    19                         return true;
    20             }
    21      
    22             return false;
    23         }

    希望有人能提出更好的方法!!

  • 相关阅读:
    HTTP
    spark-architecture
    SPARK SQL
    《算法:第四版》课后练习 1.1 答案
    随机生成六位不重复数值
    【转】策略与机制分离
    【转】Linux内核源码分析方法
    【转】机制与策略
    软件工程中的现代方法
    编码通用缩写表
  • 原文地址:https://www.cnblogs.com/2589-spark/p/3831906.html
Copyright © 2020-2023  润新知