七七八八ziJava学习笔记

算法(Java) 字符串小结

2016-10-11  本文已影响164人  Sia_Coding

在刷CC150,总结一下常用方法和解题思路。
希望早日刷完,开始LeetCode持续更新中

常用方法

StringBuilder的效率比StringBuffer稍高,如果不考虑线程安全,StringBuilder应该是首选。
StringBuffer允许多线程进行字符操作。这是因为在源代码中StringBuffer的很多方法都被关键字**synchronized **修饰了,而StringBuilder没有。

解题思路

假定我们都知道非常高效的算法来检查一个单词是否为其他字符串的子串。请将这个算法编写成一个函数,给定两个字符串s1和s2,请编写代码检查s2是否为s1旋转而成,要求只能调用一次检查子串的函数。
给定两个字符串s1,s2,请返回bool值代表s2是否由s1旋转而成。字符串中字符为英文字母和空格,区分大小写,字符串长度小于等于1000。
测试样例:

"Hello world","worldhello "

返回:false

"waterbottle","erbottlewat"

返回:true

观察可以发现,旋转先将原字符串分割成AB两段,再转成BA的形式。那么将原串拼起来,ABAB,就一定包含BA的子串。
代码:

public class ReverseEqual {
    public static boolean checkReverseEqual(String s1, String s2) {
     if(s1.length() != s2.length()) 
     return false;    
     String s = new String(s1+ s1);       
     return(s.contains(s2));
    }
}

如果想不起contains函数,自己实现也是很简单的:

public class ReverseEqual {
    public static boolean checkReverseEqual(String s1, String s2) {
        if(s1.length() != s2.length()) 
            return false;
        StringBuilder s = new StringBuilder(s1+ s1);     
        for(int i = 0; i < s1.length();i++) {
            StringBuilder b = new StringBuilder();
            for(int j = i; j < i + s1.length(); j++) {              
                b = b.append(s.charAt(j));
                if(b.toString().equals(s2))
                    return true;
            }                       
        }
        return false;
    }
}

To be continued~

上一篇下一篇

猜你喜欢

热点阅读