1.回文链表
给定一个链表的 头节点 head
,请判断其是否为回文链表。
如果一个链表是回文,那么链表节点序列从前往后看和从后往前看是相同的。
示例 1:
输入: head = [1,2,3,3,2,1] 输出: true
思路:
建立一个链表,判断头结点是否为空,否的话将每个节点存入链表,再将链表节点存入数组,使用双指针算法。
代码:
class Solution {
public boolean isPalindrome(ListNode head) {
List<Integer> ls=new ArrayList<>();
while(head!=null){
//将结点存入到链表
ls.add(head.val);//head.val是当前节点的值
head=head.next;//指向下一个结点
}
//将结点存入数组
int n=ls.size();
int[] arr=new int[n];
for(int i=0;i<n;i++){
arr[i]=ls.get(i);
}
//使用双指针,start从前向后,end从后向前,若对应的元素不相等返回false,每个对应的相等返回true
int start=0;
int end=n-1;
while(start<end){
if(arr[start]!=arr[end]){
return false;
}
start++;
end--;
}
return true;
}
}
结果:
2.分割回文串
给你一个字符串 s
,请你将 s
分割成一些子串,使每个子串都是 回文串 。返回 s
所有可能的分割方案。
回文串 是正着读和反着读都一样的字符串。
示例 1:
输入:s = "aab" 输出:[["a","a","b"],["aa","b"]]
示例 2:
输入:s = "a" 输出:[["a"]]
public String substring(int beginIndex, int endIndex)
string中的substring方法结果返回一个字符串,该字符串是此字符串的子字符串。
子串从指定的 beginIndex 开始,并扩展到索引号为 endIndex - 1 的字符。
因此子串的长度为 endIndex-beginIndex 。