三天国庆假期结束了 TAT 该回来努力学习了
记得复盘一下前天的翻转字符串
今天开始学回文字符串
描述 :给定一个长度为 n 的字符串,请编写一个函数判断该字符串是否回文。如果是回文请返回true,否则返回false。
字符串回文指该字符串正序与其逆序逐字符一致。
数据范围:0<n≤1000000
要求:空间复杂度 O(1)O(1),时间复杂度 O(n)O(n)
这个题之前在学习数据结构的时候有点印象
呃,也就记住了一个reverse()算法
当时还在想怎么解决这个字符串前后字母顺序交换问题
好嘛,直接一个函数调用解决了
给我气够呛
好吧,再多学几个解法,技多不压身
老规矩,先用JAVA
import java.util.*;
public class Solution {
public boolean judge (String str) {
int left = 0; //左指针定义为0
int right = str.length()-1; //有指针不为0,通过获取字符串长度-1确定下标位置
while(left < right)
{
if(str.charAt(left)!=str.charAt(right)) //charAt()方法一定要学会!
return false;
left++; //两个指针自增或自减继续进下一轮判断
right--;
}
return true;
}
}
经典双指针,好用的一批
只不过有的时候这个JAVA的函数容易记混记错
还有
题解中的charAt()方法,返回指定索引处的char值,索引范围是从0到length() - 1。
有点像小学时候学的那种操场追及相遇问题,两个人对头跑,直到俩人相遇,再加上乱七八糟的限定条件,这样一想就没那么抽象了
换C++其实核心代码一样,在这不多写了
好,来reverse()
感觉C++更简单一点,先写它了
class Solution {
public:
bool judge(string str) {
string temp = str;
reverse(str.begin(), str.end()); //reverse()简单粗暴直接翻转字符串
if(temp == str) //翻转结束,回头判断与原字符串是否一致
return true; //这个return是判断if条件是否成立,区别于下面一个return
return false;
}
};
很气,研究大半天算法,原来把问题想得复杂了
若改用JAVA来写,就显得没那么简便了
import java.util.*;
public class Solution {
public boolean judge (String str) {
StringBuffer temp = new StringBuffer(str);
String s = temp.reverse().toString();
/*
使用s暂存翻转后的字符串
toString()用于返回以一个字符串表示的 Number 对象值
如果方法使用了原生的数据类型作为参数,返回原生数据类型的 String 对象值。
如果方法有两个参数, 返回用第二个参数指定基数表示的第一个参数的字符串表示形式。
*/
//比较字符串是否相等
if(s.equals(str)) //判断
return true;
return false;
}
}
没见过StringBuffer方法,百度了一下,明白了些许
StringBuffer 类可以比 String 类更高效地处理字符串。 StringBuffer 类是可变字符串类,创建StringBuffer 类的对象后可以随意修改字符串的内容。每个 StringBuffer 类的对象都能够存储指定容量的字符串,如果字符串的长度超过了 StringBuffer 类对象的容量,则该对象的容量会自动扩大。
我的评价是,不如C++
题也解完了,知识也了解了
希望有一天我也能不用查阅网站直接做出算法题
我相信会等到这一天的到来
明天再见