全排列,直到找到首尾想接的排列
优化:如果一个序列前面的部分不首尾想接,则后面不必计算
class Solution {
public:
    bool endToEnd(vector<string> vstr) {
        // write code here
        bool flag = false; //标记是否成功
 	endToEnd(vstr, 0, flag);
        return flag;
    }
    //交换任意两个字符串获取全排列,start:交换开始的下标
    void endToEnd(vector<string> &vstr, int start, bool &flag)
    {
        int index = 0; //标记该序列首尾不相接开始的地方
        if(judge(vstr, index))
        {
            flag = true;
            return;
        }
        if(index < start) //序列前面的部分不首尾想接,则后面不必计算 
            return;
        for(int i = start; i < vstr.size()-1 && !flag; ++i)
        {
            for(int j = i+1; j < vstr.size() && !flag; ++j)
            {
                swap(vstr[i], vstr[j]);
                endToEnd(vstr, i+1, flag); 
                //交换回来,比如0,1交换后,下次需要0,2交换,0需要归位 
                swap(vstr[i], vstr[j]); 

            }
        }
    }
    bool judge(vector<string> &vstr, int &index)
    {
        for(int i = 1; i < vstr.size(); ++i)
            if(vstr[i-1].back() != vstr[i].front())
            {
                index = i;
                return false;
            }
        return true;
    }
};