문자열 연결 절단

16745 단어 알고리즘
문제 설명
주어진 두 문자열 A, B 에 대해 서 는 문자열 A 가 첫 번 째 로 둘러싸 인 다음 에 특정한 위 치 를 선택 하여 자 르 고 시계 방향 이나 시계 반대 방향 으로 읽 으 며 B 문자열 과 같 으 면 A, B 는 쌍 생 어 라 고 합 니 다. 주어진 n 조 문자열 에 대해 서 는 쌍 생 어 를 사용 하 는 지 여 부 를 판단 합 니 다.
입력
1 2 helloworld worldhello
출력
Yeah
문제 풀이 의 사고 방향.
  • 쌍 생 어의 기본 특징 (1). 길이 가 같다 (2). 함 유 된 자모 가 같다
  • 두 문자 중 하 나 를 첫 번 째 로 연결 한 다음 에 절단 하여 다른 문자열 을 구성 할 수 있 는 지 판단 한다
  • .
    코드 구현
    #include 
    #include 
    #include
    #include
    #include 
    #include 
    using namespace std;
    
    bool IsTwinString(const string & str1,const string & str2)
    {
        if(str1==str2)
        {
            return 1;
        }
    
        string strTemp1 = str1;
        reverse(strTemp1.begin(),strTemp1.end());
        if(strTemp1==str2)
        {
            return 1;
        }
    
        string strTemp2 = str2;
        sort(strTemp1.begin(),strTemp1.end());
        sort(strTemp2.begin(),strTemp2.end());
        if(strTemp1!=strTemp2)
        {
            return 0;
        }
    
        string strTemp3;
        char ch = str2[0];
        //     
        for(int i=1; i<str1.length()-1; i++)
        {
            //          
            if(str1[i-1]!=ch&&str1[i]!=ch)
            {
                continue;
            }
    
            strTemp1 = str1;
            strTemp2 = strTemp1.substr(i);
            strTemp1.erase(i,str1.length());
            //   
            if(str1[i]==ch)
            {
                strTemp3 = strTemp2+strTemp1;
                if(strTemp3==str2)
                {
                    return 1;
                }
            }
    
            //   
            if(str1[i-1]==ch)
            {
                reverse(strTemp2.begin(),strTemp2.end());
                reverse(strTemp1.begin(),strTemp1.end());
                strTemp3 = strTemp1+strTemp2;
                if(strTemp3==str2)
                {
                    return 1;
                }
            }
        }
    
        return 0;
    }
    
    int main()
    {
        int iTestNum;
        int iStrNum;
        cin>>iTestNum;
        string strTemp;
        vector<string> vStr;
        while(iTestNum--)
        {
            cin>>iStrNum;
            vStr.clear();
            for(int i=0; i<iStrNum; i++)
            {
                cin>>strTemp;
                vStr.push_back(strTemp);
            }
    
            bool bHasFind = 0;
            for(int i=0; i<iStrNum-1; i++)
            {
                for(int j=i+1; j<iStrNum; j++)
                {
                    if(vStr[i].length()==vStr[j].length()&&IsTwinString(vStr[i],vStr[j]))
                    {
                        bHasFind = 1;
                        break;
                    }
                }
                if(bHasFind)
                {
                    break;
                }
            }
    
            if(bHasFind)
            {
                cout<<"Yeah"<<endl;
            }
            else
            {
                cout<<"Sad"<<endl;
            }
        }
        return 0;
    }
    

    좋은 웹페이지 즐겨찾기