hash函数:包含匹配问题

输入两个字符串,问第二个字符串是否可以由第一个的部分得到?
可以的话输出剩余多少,不行则说明还缺少几个
#pragma once


#include<iostream>
#include<cstring>
#include<cstdio>

using namespace std;
const int maxSize = 22;

class Vol {
    
    
private:
	char m_has[maxSize];
	char m_need[maxSize];
	int m_hasTimes[66] = {
    
     0 };
	int m_needTimes[66] = {
    
     0 };
public:
	Vol(){
    
    }
	Vol(int i){
    
    
		gets_s(m_has);
		gets_s(m_need);

		getTimes();
		checkHas();
	}
	~Vol(){
    
    }

	void getTimes() {
    
    
		int len = strlen(m_has);

		for (int i = 0; i < len; ++i) {
    
    
			int id = getId(m_has[i]);
			++m_hasTimes[id];
		}

		int len1 = strlen(m_need);

		for (int i = 0; i < len1; ++i) {
    
    
			int id = getId(m_need[i]);
			++m_needTimes[id];
		}
	}

	int getId(char ch) {
    
    
		int ans = 0;
		if (ch >= '0'&&ch <= '9') ans = ch - '0';
		else if(ch >= 'A'&&ch <= 'Z') ans = ch - 'A' + 10;
		else  ans = ch - 'a' + 36;
		return ans;
	}


	void checkHas() {
    
    
		int len1 = strlen(m_need);

		for (int i = 0; i < len1; ++i) {
    
    
			int id = getId(m_need[i]);
			if (m_hasTimes[id] >= m_needTimes[id]) {
    
    
				m_needTimes[id] = 0;
			}
			else {
    
    
				m_needTimes[id] -= m_hasTimes[id];
			}
		}

	}

	void showAns(){
    
    
		int stillNeed = 0;
		
		int len1 = strlen(m_need);
		int len2 = strlen(m_has);

		for (int i = 0; i < len1; ++i) {
    
    
			int id = getId(m_need[i]);
			if (m_needTimes[id]) {
    
    
				stillNeed += m_needTimes[id];
				m_needTimes[id] = 0;
			}		
		}

		if (stillNeed == 0) {
    
    
			printf_s("Yes %d\n", len2 - len1);
		}
		else {
    
    
			printf_s("No %d\n", stillNeed);
		}
	}
};

void testForMl() {
    
    
	Vol sol(1);
	sol.showAns();
}

猜你喜欢

转载自blog.csdn.net/qq_34890856/article/details/105682634