给定一个 m x n
二维字符网格 board
和一个字符串单词 word
。如果 word
存在于网格中,返回 true
;否则,返回 false
。
单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。
输入:board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "ABCCED"
输出:true
class Solution {
public boolean exist(char[][] board, String word) {
int h = board.length;
int w = board[0].length;
boolean[][] visited = new boolean[h][w];
for (int i = 0; i < h; i++) {
for (int j = 0; j < w; j++) {
boolean flag = check(board, word, visited, i, j, 0);
if (flag) {
return true;
}
}
}
return false;
}
public boolean check(char[][] board, String word, boolean[][] visited, int i, int j, int index) {
if (board[i][j] != word.charAt(index)) {
return false;
} else if (index == word.length() - 1) {
return true;
}
boolean result = false;
visited[i][j] = true;
int[][] directions = { { 0, 1 }, { 0, -1 }, { 1, 0 }, { -1, 0 } };
for (int[] step : directions) {
int newI = i + step[0];
int newJ = j + step[1];
if (newI >= 0 && newI < board.length && newJ >= 0 && newJ < board[0].length) {
if (!visited[newI][newJ]) {
boolean flag = check(board, word, visited, newI, newJ, index + 1);
if (flag) {
result = true;
break;
}
}
}
}
visited[i][j] = false;
return result;
}
}
给你一个有序数组 nums
,请你** 原地** 删除重复出现的元素,使每个元素 最多出现两次 ,返回删除后数组的新长度。
不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。
示例 1:
输入:nums = [1,1,1,2,2,3]
输出:5, nums = [1,1,2,2,3]
解释:函数应返回新长度 length = 5, 并且原数组的前五个元素被修改为 1, 1, 2, 2, 3 。 不需要考虑数组中超出新长度后面的元素。
class Solution {
public int removeDuplicates(int[] nums) {
int slow = 2;
for (int fast = 2; fast < nums.length; fast++) {
if (nums[slow - 2] != nums[fast]) {
nums[slow] = nums[fast];
slow++;
}
}
return slow;
}
}