Computer >> 컴퓨터 >  >> 프로그램 작성 >> C++

C++의 최단 단어 거리 II

<시간/>

생성자에서 단어 목록을 받는 클래스가 있다고 가정하면 word1과 word2 두 단어를 사용하여 목록에서 이 두 단어 사이의 최단 거리를 찾는 메서드가 있습니다. 이 메소드는 다른 매개변수를 사용하여 여러 번 반복적으로 호출됩니다.

단어 =["연습", "만드는", "완벽한", "기술", "만드는"]이라고 가정해 봅시다.

따라서 입력이 word1 ="skill", word2 ="practice"와 같으면 출력은 3

이 됩니다.

이 문제를 해결하기 위해 다음 단계를 따릅니다. −

  • 하나의 맵 정의

  • 이니셜라이저는 단어 배열을 사용합니다.

    • for initialize i :=0, i <단어 크기일 때 업데이트(i 1 증가), −

      • m[단어[i]]

        끝에 i 삽입
  • shortest() 함수를 정의하면 word1, word2,

    가 필요합니다.
  • 배열 정의 arr1 :=m[word1]

  • 배열 정의 arr2 :=m[word2]

  • i :=0, j :=0

  • ret :=무한대

  • 동안 (i

    • ret :=ret의 최소값 및 |arr1[i] - arr2[j]|

    • arr1[i]

      • (i를 1씩 증가)

    • 그렇지 않으면

      • (j를 1씩 증가)

  • 리턴 렛

예시

이해를 돕기 위해 다음 구현을 살펴보겠습니다. −

#include <bits/stdc++.h>
using namespace std;
class WordDistance {
public:
   unordered_map <string, vector <int< > m;
   WordDistance(vector<string<& words) {
      for(int i = 0; i < words.size(); i++){
         m[words[i]].push_back(i);
      }
   }
   int shortest(string word1, string word2) {
      vector<int<& arr1 = m[word1];
      vector<int<& arr2 = m[word2];
      int i = 0;
      int j = 0;
      int ret = INT_MAX;
      while (i < arr1.size() && j < arr2.size()) {
         ret = min(ret, abs(arr1[i] - arr2[j]));
         if (arr1[i] < arr2[j]) {
            i++;
         }
         else
            j++;
      }
      return ret;
   }
};
main(){
   vector<string< v = {"practice", "makes", "perfect", "skill","makes"};
   WordDistance ob(v);
   cout << (ob.shortest("skill", "practice")) << endl;
   cout << (ob.shortest("makes", "skill"));
}

입력

{"practice", "makes", "perfect", "skill", "makes"}
Call shortest("skill", "practice")
Call shortest("makes", "skill")

출력

3
1