单词搜索
虽然是个图的搜索,但本质还是回溯。不是dfs,两者的区别在于dfs不会恢复现场,而回溯需要恢复现场。
class Solution {
boolean flag = false;
public boolean exist(char[][] board, String word) {
int[][] visited = new int[board.length][board[0].length];
for(int i=0; i<board.length; i++) {
for(int j=0; j<board[0].length; j++) {
backtrack(board, word, visited, i, j, 0);//以ij为起点寻找符合条件的路线
if(flag)return true;
}
}
return false;
}
public void backtrack(char[][] board, String word, int[][] visited, int i, int j, int k) {
if(k>=word.length()) {
flag = true;
return;
}
if(i<0 || j<0 || i>=board.length || j>=board[0].length || visited[i][j]==1) {
return;
}
if(visited[i][j]==0 && board[i][j]==word.charAt(k)) {
visited[i][j]=1;//分别向四个方向搜索
backtrack(board, word, visited, i+1, j, k+1);
backtrack(board, word, visited, i-1, j, k+1);
backtrack(board, word, visited, i, j+1, k+1);
backtrack(board, word, visited, i, j-1, k+1);
visited[i][j]=0; //因为exist中有for循环,每次搜寻的起点不同
}
return;
}
}
删除链表的倒数第k个结点
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
int length=0;
ListNode a=head;
ListNode b=head;
while(a!=null) {
length++;
a=a.next;
}
if(length==1)return head.next;
if(length==0)return null;
int i=length-n;
int j=1;
if(i==0)return head.next;
while(b!=null) {
if(j!=i) {
b=b.next;
j++;
}
else {
b.next=b.next.next;
break;
}
}
return head;
}
}