题目
就是判断传入的String是不是回文字符串,是的话返回true,否则返回false。
举个例子
示例1
输入
“absba”
输出
true
示例2
输入
“ranko”
输出
false
思路
常见的有两种思路,一种是从两头向中间遍历,另一个是从中间向两头进行遍历。
时间复杂度是O(n),空间复杂度都是O(1);
代码实现
第一种是从两头向中间进行比较
public boolean judge (String str) {
// write code here
int i=0,j=str.length()-1;
while(i<j){
if(str.charAt(i)!=str.charAt(j)){
return false;
}
i++;
j--;
}
return true;
}
第二种是从中间向两头进行比较
public boolean judge (String str) {
// write code here
int i=0,j=str.length()-1;
//从中心向两边进行扩展
//如果字符串长度是偶数,两个不能相等,一个从中间向左遍历,一个从中间向右边遍历
if((str.length()&1)==0){
i=(str.length()>>1)-1;
j=str.length()>>1;
}else{
//如果是奇数,那就都从最中心的元素开始
i=j=(str.length()>>1);
}
while(i>=0&&j<str.length()){
if(str.charAt(i)!=str.charAt(j)){
return false;
}
i--;
j++;
}
return true;
}
还有一种是判断回文子串
题目
给定一个字符串,你的任务是计算这个字符串中有多少个回文子串。
具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被视作不同的子串。
示例 1:
输入:“abc”
输出:3
解释:三个回文子串: “a”, “b”, “c”
示例 2:
输入:“aaa”
输出:6
解释:6个回文子串: “a”, “a”, “a”, “aa”, “aa”, “aaa”
来源:力扣(LeetCode)
思路
主要从中间向两边计算子串的个数,关键点是计算出中心点的个数;什么是中心点,就是start和end初始指向的字符,那么中心点有几个呢?可能有1个或两个,例如上面的就是如果长度是偶数就有两个,如果是奇数就有1个;那整个字符串的中心点有几个呢?
答案是2length-1;
例如 aba:中心点有 a,b,a,ab,ba;个数 = 23-1=5;
再举个例子abcba: 中心点有a,b,c,b,a,ab,bc,cb,ba 个数=2*5-1=9;
代码实现
class Solution {
int sum = 0;
public int countSubstrings(String s) {
for(int i=0;i<s.length();i++){
//回文串长度是奇数
count(s,i,i);
//回文串长度是偶数
count(s,i,i+1);
}
return sum;
}
public void count(String s,int start,int end){
//从中间向两边计算回文子串,如果是的话,sum++;
while(start>=0&&end<s.length()&&s.charAt(start)==s.charAt(end)){
sum++;
end++;
start--;
}
}
}