题目
思路
只能想到暴力遍历,然后使用数组来存储每个元素出现的次数;
去看了题解,使用三个数组分别统计每行、每列、每个3*3子区域中数字出现的次数,只需要遍历一遍,同时更新这三个数组就行了;
代码
public boolean isValidSudoku(char[][] board) {
// 使用数组来记录每个数字出现的次数
int[][] rows = new int[9][9];
int[][] col = new int[9][9];
int[][][] subboxs = new int[3][3][9];
for(int i = 0; i < 9; i ++){
for(int j = 0; j < 9; j++){
if(board[i][j] != ('.')){
int nums = board[i][j] - '0' - 1; // 下标从0开始 也就是第0个下标记录1出现的次数
rows[i][nums] += 1;
col[j][nums] += 1;
subboxs[i/3][j/3][nums] += 1;
if(rows[i][nums] > 1 || col[j][nums] > 1 || subboxs[i/3][j/3][nums] > 1){
return false;
}
}
}
}
return true;
}
题目
思路
将字符串转化为数字,使用hashmap记录每个字符的对应的数字;
代码
public boolean isIsomorphic(String s, String t) {
if(s.length() != t.length()){
return false;
}
// 使用hash表来记录每个字符对应的数字 将字符串转化为数字
HashMap<Character, Integer> smap = new HashMap<>();
int scount = 0;
HashMap<Character, Integer> tmap = new HashMap<>();
int tcount = 0;
for(int i = 0; i < s.length(); i++){
if(!smap.containsKey(s.charAt(i))){
smap.put(s.charAt(i), scount++);
}
if(!tmap.containsKey(t.charAt(i))){
tmap.put(t.charAt(i), tcount++);
}
if(smap.get(s.charAt(i)) != tmap.get(t.charAt(i))){
return false;
}
}
return true;
}