最少字符填充成迴文子串:第一次記事本編程+命令行調試

原題如圖:
在這裏插入圖片描述
主要思路:枚舉迴文對稱軸,有字符軸和間隔週兩種情況(分別對應恢復後的迴文串爲奇數還是偶數的情況。
之後動態規劃,f[i][j] = min(f[i-1][j]+f[i][j-1]) + 1-----s[i]和s[j]不等
若相等,則直接f[i][j]=f[i-1][j-1]

思路很簡單,最後時間都花在了邊界條件的確定上。
由於第一次用記事本編程,一些語法錯誤也不能很快的找到,也不能設斷點之類的(可以,但目前不會。。)所以花費了很長時間

首先是f[0][0]的初始化,應該是2
其次是f[0][i]的初始化,要根據f[0][0]處的值做調整
(感覺這樣很不優雅,但目前來說有效,希望大家有好辦法的留言賜教)

也算一個新的嘗試,太依賴IDE了(用輸出調試又何嘗不是。。沒什麼本質區別
有時間可以肉眼debug(\doge)
步驟如下:首先是寫這個xyz.txt
發現g++似乎編譯不了txt,於是改名爲xyz.cpp, 然後用:
g++ xyz.cpp
得到: a.exe
命令行直接 a.exe即可,有輸入的話接下來直接輸入就行

(深夜了,頭腦不清醒,有問題歡迎留言,非常抱歉)

最後代碼如下,並不完整,追蹤解沒有寫出,大家自己補充吧
xyz xjj,要努力啊!
接下來的這幾天,加油!
大家晚安~~

# include <iostream>
# include <cstring>
using namespace std;
char s[1000], mark[1000], ss[1000];
int slen, res = 10000;
int f[1000][1000];
char s1[1000], s2[1000];
int s1len, s2len;
// 0, 1, 2, m - 1, |, m + 1, ~ m + (n)

// 0, 1,| 2, 3, 4
// abcdca
int func()
{
    int flag1 = 1;
    int flag2 = 1;
    f[0][0] = int((s1[0] != s2[0])) + int((s1[0] != s2[0]));
    cout << "www" <<1<<endl;
    for (int i = 1; i < s1len; i++)
    {
        if(s1[i] == s2[0]){
                if(f[0][0] == 2)
                    f[i][0] = f[i - 1][0] - flag1;
                else 
                    f[i][0] = f[i - 1][0];
                flag1 = 0;
            
            
        }
        else f[i][0] = (s1[i] != s2[0]) + f[i - 1][0];
    }
    for (int i = 1; i < s2len; i++)
    {
        if(s1[0] == s2[i]){
            if(f[0][0] == 2)
                f[0][i] = f[0][i - 1] - flag2;
            else f[0][i] = f[0][i - 1];
            flag2 = 0;
            
            
        }
        else f[0][i] = (s1[0] != s2[i]) + f[0][i - 1];
    }
    for (int i = 1; i < s1len; i++)
    {
        for(int j = 1; j < s2len; j++)
        {
            if(s1[i]==s2[j])
                f[i][j] = f[i-1][j-1];
            else 
                f[i][j] = min(f[i-1][j], f[i][j-1]) + 1;
            // 標記mark
        }
    }
    // a, b
    // abb. b
    // abc, d
    cout << "-------------" << endl;
    for (int i = 0; i < s1len; i++)
    {
        for(int j = 0; j < s2len; j++)
        {
            cout << f[i][j] << ' ';
        }
        cout << endl;
    }
    cout << "-------------" << f[s1len-1][s2len-1] << "-------" << endl;
    return f[s1len-1][s2len-1];
}


int main()
{
    cout << 3 << endl;
    while(cin >> s){
        res = 1000;
    slen = strlen(s);
    cout << 2 << endl;
    for (int i = 1; i < slen - 1; i++)
    {
        memset(f, -1, sizeof(f));
        for(int k =  i - 1; k >=0; k--)
        {
            s1[i - 1 - k] = s[k];
            s1[i - k] = 0;
        }
        for(int k = i + 1; k < slen; k++)
        {
            s2[k - i - 1] = s[k];
            s2[k - i] = 0;
        }
        s1len = strlen(s1);
        s2len = strlen(s2);
        
        int temp = func();
        if(temp < res)
        {
            // 通過mark 回溯求解, 記錄在ss
            res = temp;
        }
        cout << "hhhh   :   " <<  res << endl;
    }
    cout << "aaa" << endl;
    for (int i = 1; i < slen; i++)
    {
        memset(f, -1, sizeof(f));
        for(int k =  i - 1; k >=0; k--)
        {
            s1[i - 1 - k] = s[k];
            s1[i - k] = 0;
        }
        for(int k = i; k < slen; k++)
        {
            s2[k - i] = s[k];
            s2[k - i + 1] = 0;
        }
        s1len = strlen(s1);
        s2len = strlen(s2);
        int temp = func();
        // abcdecad
        if(temp < res)
        {
            // 通過mark 回溯求解, 記錄在ss
            res = temp;
        }
        cout << "hhhh   :   " <<  res << endl;
    }
    if(res > slen-1)
        res = slen-1;
    cout << "hhhh   :   " <<  res << endl;}

    // get ss, res.
    return 0;
}
	
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章