Leetcode---常见字符串题型

1.判断单词大小写是否正确:(脑子秀逗的一道题)
给定一个单词,你需要判断单词的大写使用是否正确。
我们定义,在以下情况时,单词的大写用法是正确的:
全部字母都是大写,比如"USA"。
单词中所有字母都不是大写,比如"leetcode"。
如果单词不只含有一个字母,只有首字母大写, 比如 “Google”。
否则,我们定义这个单词没有正确使用大写字母。
看着挺简单的一道题吧,然后我想到的是暴力求解-直接循环判断即可,啪啪啪写了大半天还发现卡住了,呜呜呜呜呜什么鬼?然后我发现除了正则还有一种简单的一行代码就能解决的哈哈哈哈哈

Class Solution{
    public boolean detectCapitalUse(String word) {
        return  word.equals(word.toLowerCase())||word.equals(word.toUpperCase())||s.substring(1).equals(s.substring(1).toLowerCase());
    }
}

嘿嘿嘿嘿嘿是不是就很简单了,头发快掉没了呀,算法还是搞不懂哎
2.最长回文子串
解法一:暴力法:AC

class Solution {
    public String longestPalindrome(String s) {
        String ans = "";
    int max = 0;
    int len = s.length();
    for (int i = 0; i < len; i++)
        for (int j = i + 1; j <= len; j++) {
            String test = s.substring(i, j);
            if(test.length() > max && isMax(test)){
           max = test.length();
           ans = test;
           }
        }
    return ans;
    }
    public boolean isMax(String test) {
		int len = test.length();
		for (int i = 0; i < len / 2; i++) {
			if (test.charAt(i) != test.charAt(len - i - 1)) {
				return false;
			}
		}
		return true;
   }
}

解法2.中心扩散法:一个中心向两侧扩展找到这个中心最长回文串的长度,这个中心可能是一个字符(最长回文子串是奇数个),也可能是两个字符(最长回文子串是偶数个):AC

class Solution {
    public String longestPalindrome(String s) {
      if(s.length()<=1){
          return s;
      }
      String res=s.substring(0,1);
      int maxLen=1;
      for(int i=0;i<s.length();i++){
          String ordStr=isPalindrom(s,i,i);
          String newStr=isPalindrom(s,i,i+1);
          String maxStr=ordStr.length()>newStr.length()?ordStr:newStr;
          if(maxStr.length()>maxLen){
              maxLen=maxStr.length();
              res=maxStr;
          }
      }
      return res;
    }
    public String  isPalindrom(String s,int left,int right){
        while(left>=0&&right<s.length()){
            if(s.charAt(left)==s.charAt(right)){
               left--;
               right++;
            }else{
                break;
            }
        }
        return   s.substring(left+1,right);//substring(beginIndex,endIndex)起始索引包括,结束索引不包括
    }
}

解法3:马拉车算法(Manacher)理解即可
Manacher 算法本质上还是中心扩散法,只不过它使用了类似 KMP 算法的技巧,充分挖掘了已经进行回文判定的子串的特点,在遍历的过程中,记录了已经遍历过的子串的信息,也是典型的以空间换时间思想的体现。

ababbbac----->#a#b#a#b#b#b#a#c#

3.给定一个字符串,编写一个函数判定其是否为某个回文串的排列之一。
回文串是指正反两个方向都一样的单词或短语。排列是指字母的重新排列。
回文串不一定是字典当中的单词。
AC
思路:消消乐思想–new一个HashSet集合,遍历字符串,集合中有就删除该元素,没有就添加到集合中,判断最后集合长度是否<=1,是则true,否则输出false
当当当当~怎么样有没有发现很nice

class Solution {
    public static boolean canPermutePalindrome(String s){
        HashSet<Character> set = new HashSet<>();
        char[] chars = s.toCharArray();
        for (int i = 0; i < chars.length; i++) {
            if(set.contains(chars[i])){
                set.remove(chars[i]);
            }else{
                set.add(chars[i]);
            }
        }
        return set.size()<=1;
    }
}

4.面试题58 - II. 左旋转字符串
字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。

class Solution {
    public String reverseLeftWords(String s, int n) {
       StringBuffer str=new StringBuffer();
       if(n<s.length()){
       //Java中字符串拼接三种方法:
       //方法1:append()
           str.append(s.substring(n)).append(s.substring(0,n));
           return str.toString();
       //方法2:+
       //    return  s.substring(n)+s.substring(0,n);
       //方法3:concat()
       //   return s.substring(n).concat(0,n);
       }else{
           return s;
       }
    }
}

你可能感兴趣的:(Leetcode)