思路一:遍历数组,对第一个单词的每一个位置,寻找相隔最近的第二个单词,然后不断更新最短距离值。
思路二:思路一在时间复杂度的考量上不够合理,因此想到设置两个int数组,分别记录第一个单词和第二个单词出现的每个位置,再求两数组元素之间相差的最小值。这种解法虽然只要遍历两次数组,时间复杂度从O(N^2)降到O(N),但由于两个int数组的存在,导致了O(N)的空间复杂度,所以显然也不够合理。
思路三:双指针,分别记录两个单词的出现位置,然后计算距离并不断优化取最小值。
int min(int a,int b){
return a<b?a:b;
}
int findClosest(char** words, int wordsSize, char* word1, char* word2){
int w1=0,w2=0; //记录w1,w2下标
for(;w1<wordsSize;w1++){
if(strcmp(words[w1],word1)==0){
break;
}
}
for(;w2<wordsSize;w2++){
if(strcmp(words[w2],word2)==0){
break;
}
}
int dis=abs(w1-w2); //记录距离,不断优化,取最小值
for(int i=min(w1,w2);i<wordsSize;i++){
if(strcmp(words[i],word1)==0) w1=i;
else if(strcmp(words[i],word2)==0) w2=i;
else;
if(dis>abs(w1-w2)) dis=abs(w1-w2); //取绝对值
}
return dis;
}
记录一下出现的几个问题:
1、C语言中,将字符串常量 赋值给指针时 , 首先去全局变量区的常量区查询该字符串常量是否存在 :如果存在 , 直接使用该 字符串常量地址 赋值给 char*
指针 ;如果不存在 , 直接在常量区 创建一个新的字符串 , 然后将地址 赋值给 char*
指针
代码验证一下这个结论:
#include<stdio.h>
#include<string.h>
int main(){
char* a="123";
char* b="123";
printf("a:%d\n",a);
printf("b:%d\n",b);
if(a==b) printf("a==b:true\n");
if(strcmp(a,b)==0) printf("strcmp:true\n");
return 0;
}
输出长这样:
2、取绝对值:abs()