题目:
给定一个单词列表和两个单词 word1 和 word2,返回列表中这两个单词之间的最短距离。
示例: 假设 words = ["practice", "makes", "perfect", "coding", "makes"]
输入: word1 = “coding”, word2 = “practice” 输出: 3 输入: word1 = "makes", word2 = "coding" 输出: 1 注意: 你可以假设 word1 不等于 word2, 并且 word1 和 word2 都在列表里。
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/shortest-word-distance 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
结果:
解题思路:
1,将包含words1单词的下标记录在nums1中,同样将words2单词的下标记录在nums2中。
2,循环找出nums1和nums2中下标距离最短的就是题目的要求。
3,第一次循环结束后,可能是其中一个nums到最后了,所以只要判断最后有没有可能距离更短,如果有可能继续循环。没可能则返回了。
代码:
int shortestDistance(char ** words, int wordsSize, char * word1, char * word2){
int nums1[100] = {};
int nums2[100] = {};
int index1 = 0;
int index2 = 0;
int i, j;
for(i = 0; i < wordsSize; i++) {
if(strcmp(words[i], word1) == 0) {
nums1[index1++] = i;
}
if(strcmp(words[i], word2) == 0) {
nums2[index2++] = i;
}
}
int count = abs(nums1[0] - nums2[0]);
for(i = 0, j = 0; i < index1 && j < index2; ) {
count = abs(nums1[i] - nums2[j]) < count ? abs(nums1[i] - nums2[j]) : count;
if(nums1[i] < nums2[j]) {
i++;
} else {
j++;
}
}
if(i == index1 && j < index2 && nums1[i-1] > nums2[j]) {
while(j < index2 && nums1[i-1] > nums2[j]) {
count = abs(nums1[i-1] - nums2[j]);
}
}
if(i < index1 && j == index2 && nums1[i] < nums2[j-1]) {
while(i < index1 && nums1[i] < nums2[j - 1]) {
count = nums2[j - 1] - nums1[i];
}
}
return count;
}