Programmersニュースクラスタ


問題の答えよりも、どうやって簡単にできるか悩んでいます.
  • 文字列を2文字に分割して2文字列の並びと交差の問題を求める.
  • 文字列では文字のみ有効で、大文字と小文字を区別せず、第1文ではtransform関数を使用して文字列をすべて小文字に変換します.
  • transform(str1.begin(), str1.end(), str1.begin(), ::tolower) :文字列str 1をすべて小文字に変換する関数.
  • 習ったことがある.また勉強しました.
  • for文中に文字だけ入れてvector
  • 両方の比較対象が公集であれば忘れてはならない65536
  • 筆者は2文字列の交点と並列を求める際に使用した합집합 = 두 집합을 모두 더한 수 - 교집합の原理.
  • だから交点だけを求めたcheck関数で重複部分の個数を数えた.
  • 💻完全なコード

    #include <string>
    #include <vector>
    #include <string.h>
    #include <algorithm>
    
    using namespace std;
    
    bool check[2001];
    
    int solution(string str1, string str2)
    {
        int answer = 0;
    
        vector<string> v[2];
    
        transform(str1.begin(), str1.end(), str1.begin(), ::tolower);
        transform(str2.begin(), str2.end(), str2.begin(), ::tolower);
    
        for (int i = 0; i < str1.size() - 1; i++)
        {
            if (str1[i] >= 'a' && 'z' >= str1[i] && 'a' <= str1[i + 1] && str1[i + 1] <= 'z')
                v[0].push_back(str1.substr(i, 2));
        }
    
        for (int i = 0; i < str2.size() - 1; i++)
        {
            if (str2[i] >= 'a' && 'z' >= str2[i] && 'a' <= str2[i + 1] && str2[i + 1] <= 'z')
                v[1].push_back(str2.substr(i, 2));
        }
    
        if (v[0].empty() && v[1].empty())
            return 65536;
    
        int uni = 0, intersection = 0;
    
        for (int i = 0; i < v[0].size(); i++)
        {
            for (int j = 0; j < v[1].size(); j++)
            {
                if (check[j])
                    continue;
                if (v[0][i] == v[1][j])
                {
                    check[j] = 1;
                    intersection++;
                    break;
                }
            }
        }
        uni = v[0].size() + v[1].size() - intersection;
    
        if (uni == 0)
            return 65536;
    
        double tmp = (double)intersection / (double)uni;
    
        answer = tmp * 65536;
    
        return answer;
    }