赞
踩
给定两个字符串 s1 和 s2,要求判定 s2 是否能够被 s1 做循环移位得到的字符串包含
解决办法:s1 进行循环移位的结果是 s1s1 的子字符串,因此只要判断 s2 是否是 s1s1 的子字符串即可。
public class Exer {
public boolean strStr(String s1, String s2) {
StringBuilder sb = new StringBuilder(s1);
sb.append(s1);
return sb.toString().contains(s2);
}
}
思路:先进行拼串,看s2是不是s1s1的子字符
将字符串向右循环移动 k 位
解决办法:从k处分开,前后字符串翻转后拼接再翻转
public class Exer { public static void main(String[] args) { String s = "abcd123"; int k = 3 ; String overturn = overturn(s, k); System.out.println(overturn); } //拼接截取 public static String overturn(String s,int k) { StringBuilder sb = new StringBuilder(s); sb.append(s); return sb.toString().substring(sb.length()-k-s.length(),sb.length()-k); } //对前后两部分的字符串都进行翻转,拼串后再翻转 public static String overturn(String s, int k) { String s2 = s.substring(s.length() - k, s.length()); String s1 = s.substring(0, s.length() - k); StringBuilder s11 = new StringBuilder(s1).reverse(); StringBuilder s22 = new StringBuilder(s2).reverse(); return s11.append(s22).reverse().toString(); } }
思路:
将每个单词翻转,然后将整个字符串翻转
public class Exer { public static void main(String[] args) { String s = "I am a student"; String s1 = word_overturn(s); System.out.println(s1); } public static String word_overturn(String s) { StringBuilder sb = new StringBuilder(); String[] strs = s.trim().split(" "); for (int i = strs.length - 1; i >= 0; i--) { if(strs[i].equals(""))continue; sb.append(strs[i] + " "); } return sb.toString().trim(); } }
思路:可以用栈来实现,但这里用个简单的
给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词
public boolean isAnagram(String s, String t) { char[] schars = s.toCharArray(); char[] tchars = t.toCharArray(); Arrays.sort(schars); Arrays.sort(tchars); return Arrays.equals(schars,tchars); } //将s每个字符按照26个字母的数量存入,再用t减掉,如果有字母数量不是0的话就不是字母异位词 public boolean isAnagram(String s,String t) { int[] arr = new int[26]; for (char c : s.toCharArray()) { arr[c - 'a']++; } for (char c : t.toCharArray()) { arr[c - 'a']--; } for (int i : arr) { if (i != 0) { return false; } } return true; }
思路:
给定一个包含大写字母和小写字母的字符串,找到通过这些字母构造成的最长的回文串。
class Solution { public int longestPalindrome(String s) { int[] cnts = new int[256]; for (char c : s.toCharArray()) { cnts[c]++; } int palindrome = 0; for (int cnt : cnts) { palindrome += (cnt / 2) * 2; } if (palindrome < s.length()) { palindrome++; } return palindrome; } }
思路:
给定两个字符串 s 和 t,判断它们是否是同构的。
如果 s 中的字符可以按某种映射关系替换得到 t ,那么这两个字符串是同构的。
class Solution {
public boolean isIsomorphic(String s, String t) {
if(s.length() != t.length())return false;
for (int i = 0; i < s.length(); i++) {
if(s.indexOf(s.charAt(i)) != t.indexOf(t.charAt(i))){
return false;
}
}
return true;
}
}
思路:
给你一个字符串s,请你统计并返回这个字符串中回文子串的数目。
class Solution { int count = 0; public int countSubstrings(String s){ if(s == null || s.length() < 1){ return 0; } for (int i = 0; i < s.length(); i++) { extendPalindrome(s,i,i+1); extendPalindrome(s,i,i); } return count; } public void extendPalindrome(String s, int left, int right){ while(left >= 0 && right <s.length() && s.charAt(left--) == s.charAt(right++)){ count++; } } }
思路:中心扩散法
如:121,则返回true
方法一:把数换成字符,遍历首尾字符比较
class Solution { public boolean isPalindrome(int x) { if(x < 0)return false; String s = String.valueOf(x); for (int i = 0,j = s.length() - 1; i < s.length() && i < j; i++,j--) { if (s.charAt(i) != s.charAt(j)) { return false; } } return true; } }
方法二: 直接计算倒序数,从后向前计算每一位数,计算完成后和原数对比
if(x >= 0){ if(x == 0){ return true; } int cur = 0; int num = x; while(num != 0){ cur = cur * 10 + num % 10;//当前数乘10再把num的个位数加上 num /= 10;//此时num再小10倍 } return cur == x; } return false;
结果:
暴力手撕成功,但超时
public static int countBinarySubstrings(String s) { int time = 0; for (int i = 0; i < s.length(); i++) { for (int j = i+1; j < s.length(); j++) { String substring = s.substring(i, j + 1); if(isBSstr(substring)){ time++; } } } return time; } public static boolean isBSstr(String s){ if(s.length() % 2 != 0){ return false; } if(s.contains("0") && !s.contains("1") || !s.contains("0") && s.contains("1")){ return false; } if(s.substring(0,s.length()/2).contains("0") && s.substring(0,s.length()/2).contains("1") || s.substring(s.length()/2,s.length()).contains("0") && s.substring(s.length()/2,s.length()).contains("1")){ return false; } return true; } }
思路:
class Solution { public int countBinarySubstrings(String s) { int preLen = 0, curLen = 1, count = 0; for (int i = 1; i < s.length(); i++) { if (s.charAt(i) == s.charAt(i - 1)) { curLen++; } else { preLen = curLen; curLen = 1; } if (preLen >= curLen) { count++; } } return count; } }
思路:
给你两个字符串 s 和 goal ,只要我们可以通过交换 s 中的两个字母得到与 goal 相等的结果,就返回 true ;否则返回 false 。
class Solution { public boolean buddyStrings(String s, String goal) { if(s.length() != goal.length())return false; if (s.equals(goal)) { int[] sarr = new int[26]; for (char c : s.toCharArray()) { if (++sarr[c - 'a'] > 1) { return true; } } return false; } char sc = ' '; char gc = ' '; int time = 0,index = 0; for (int i = 0; i < s.length(); i++) { if (s.charAt(i) != goal.charAt(i)) { if (time == 1) { index = i; time++; continue; } else if (time == 2) { return false; } sc = s.charAt(i); gc = goal.charAt(i); time++; } } return !(sc != goal.charAt(index) || gc != s.charAt(index)); } }
思路:
equals()
:比较两个字符串是否相等equalsIgnoreCase( )
:忽略大小写的两个字符串是否相等比较String.valueOf()
:把数字转换成String类型(不用担心object是否为null值这一问题)subString()
:截取字符串中的一段字符串str=str.substring(int beginIndex);
str=str.substring(int beginIndex,int endIndex);
charAt()
:返回指定索引处char值toLowerCase()
:将所有在此字符串中的字符转化为小写 toUpperCase()
方法: 将字符全部转化为大写indexOf()
:指出 String 对象内子字符串的开始位置getBytes()
:得到一个系统默认的编码格式的字节数组append()
方法:用于拼串StringBuilder.toString()
就可以将其转化为String类型str.length();
compareTo(another str)
compareTOIgnoreCase(another str)
equals(another str)
equalsIgnoreCase(another str)
str.toCharArray();
将字符串改成char型数组class MyQueue{ Stack<Integer> stack1 = new Stack<>(); Stack<Integer> stack2 = new Stack<>(); public MyQueue() { } public void push(int x) { if(stack2.isEmpty()){ stack1.push(x); }else { while (!stack2.isEmpty()){ stack1.push(stack2.pop()); } stack1.push(x); } } public int pop() { if(stack1.isEmpty() && stack2.isEmpty()){ return 0; } while (
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。