动态规划:打表法最长回文串的个数,北京理工上机18-1

对给定的字符串找到其中最长的回文子串,并返回最大长度和个数。

#pragma once

#include<iostream>
#include<string>

using namespace std;
const int MAXLEN = 22;


class SOL {
private:
	string m_str;
	int m_isTable[MAXLEN][MAXLEN];
public:
	SOL() {}
	SOL(string s) {
		toSmall(s);
		//test
		//cout<<m_str<<endl;
		setTable();
		getTable();
	}
	~SOL() {}


	void toSmall(string &s) {
		int len = s.size();
		m_str = "";

		for (int i = 0; i < len; ++i) {
			m_str += toLower(s[i]);
		}
	}	
	char toLower(char c) {
		if(c >= 'A'&&c <= 'Z') 
			c+= 'a' - 'A';
		return c;
	}

	void setTable() {
		int size = m_str.size();

		for (int i = 0; i < size; ++i) {
			m_isTable[i][i] = 1;
			if (i + 1 < size)
				m_isTable[i][i + 1] = (m_str[i] == m_str[i + 1])? 1:0;
			
		}
	}

	void getTable() {
		int size = m_str.size();

		for (int dir = 2; dir < size; dir++)
			for (int hen = 0, lie = dir; hen < size&&lie < size; hen++, lie++) {
					m_isTable[hen][lie] =isSym(hen,lie)10;
			}

		//test
		/*
		for(int i=0;i<size;i++){
			for(int j=i;j<size;j++){
				cout<<m_isTable[i][j]<<' ';
			}
			cout<<endl;
		}*/
	}

	bool isSym(int i, int j) {
		return m_isTable[i + 1][j - 1] && m_str[i] == m_str[j];
	}

	void countLongest() {
		int maxlen = 0;
		int count = 0;
		bool get = false;
		int size = m_str.size();

		for (int dir = size - 1; !get&&dir >= 0; dir--)
			for (int lie = dir, h = 0; lie < size&&h < size; h++, lie++) {
				if (m_isTable[h][lie]) {
					maxlen = lie - h + 1;
					get = true;
					count++;
				}
			}

		cout << maxlen << " " << count << endl;
	}


};

void testFor1() {
	string str = "SBaAbacdccdc";
	SOL sol(str);
	sol.countLongest();
}

注意:

 1. 函数三行原则
 2. 复杂判断单独做函数
 3. for循环内部最好一个事件
 4. 可以阶段测试
 
void getTable() {
		int size = m_str.size();

		for (int dir = 2; dir < size; dir++)
			for (int hen = 0, lie = dir; hen < size&&lie < size; hen++, lie++) {
					m_isTable[hen][lie] =isSym(hen,lie)10;
			}

		//test
		/*
		for(int i=0;i<size;i++){
			for(int j=i;j<size;j++){
				cout<<m_isTable[i][j]<<' ';
			}
			cout<<endl;
		}*/
	}

	bool isSym(int i, int j) {
		return m_isTable[i + 1][j - 1] && m_str[i] == m_str[j];
	}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值