给定两个字符串 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 (