1143. 最长公共子序列
题目
![](https://img-blog.csdnimg.cn/img_convert/1155bf3a99495bddf1d98103e074a38e.png)
题解
int longestCommonSubsequence(char * text1, char * text2){
int ** dp = (int**)malloc(sizeof(int*)*strlen(text1));
for(int i = 0;i < strlen(text1);i++){
dp[i] = (int*)malloc(sizeof(int)*strlen(text2));
}
//初始化第一行
for(int i = 0;i < strlen(text2);i++){
if(text2[i] == text1[0]){
while(i < strlen(text2)){
dp[0][i] = 1;
i++;
}
break;
}
dp[0][i] = 0;
}
//初始化第一列
for(int i = 0;i < strlen(text1);i++){
if(text1[i] == text2[0]){
while(i < strlen(text1)){
dp[i][0] = 1;
i++;
}
break;
}
dp[i][0]=0;
}
//解dp数组
for(int i = 1;i < strlen(text1);i++){
for(int j = 1;j < strlen(text2);j++){
if(text1[i] == text2[j]){
dp[i][j] = dp[i-1][j-1]+1;
}else{
dp[i][j] = dp[i-1][j]>dp[i][j-1]? dp[i-1][j]:dp[i][j-1];
}
}
}
return dp[strlen(text1)-1][strlen(text2)-1];
}
要点
最长公共子序列初始化是要初始化第一行,第一列。且在初始化过程中,只要出现了1,那么dp数组该行/列后面也都是1。
解dp[i][j]的过程是如果text1[i]=text2[j],则dp[i][j]等于前一个对角线上的值+1,否则等于所在行/列的前一个值中的较大的那个。
2319. 判断矩阵是否是一个 X 矩阵
题目
![](https://img-blog.csdnimg.cn/img_convert/f0a50cc932e7584eca63e1e40149e6b3.png)
题解
bool checkXMatrix(int** grid, int gridSize, int* gridColSize){
//标记每行对角线所在的列,遍历每一行
int beg = 0,end = *gridColSize-1;
for(int i = 0;i < gridSize;i++){
for(int j = 0;j < *gridColSize;j++){
if(j == beg || j == end){
if(grid[i][j] == 0){
return false;
}
}else{
if(grid[i][j] != 0){
return false;
}
}
}
beg++;
end--;
}
return true;
}
要点
设置双指针用来指示现在正在遍历的行中有对角线元素的位置,然后遍历所有的行。
如果遇到对角线元素为0则返回false,如果遇到非对角线元素不为0则返回false,所有都没错则返回true。