关于麻将14张牌的胡牌计算

求助 关于麻将14张牌的胡牌计算
各位高手   我最近在做一个麻将的题   后面遇到关于14张牌的算法不是很清楚
看了几个例子   感觉有些不大懂   请问你们这个算法该怎么计算  
有的说先把将挑出来   但是如果遇到像1   2   2   3   4   这种清楚   把2个2或者2个3挑出来这个例子就不成立了   还有比如出现1   2   2   2   2   3这种清楚   怎么划分
希望各位高手能给我说下算法   感激不尽   有代码更好^o^

------解决方案--------------------
// 这是我的小麻将中用的办法.
// 变量名没时间修改. 还是拼音.

import java.util.*;
import java.util.regex.*;

class YanzhengHupai {
// 下边的正则表达式和yanzheng()和yanzhengMozi()用来验证一副牌能不能胡.
// 这里只验证简单的33332牌型.
// 不知道还有没有漏掉的可能胡的牌. 先不管了.
// 书上也没讲怎么用正则表达式. 引用前边已经匹配的字符串里边的字符不会.
// 还好今晚想到了这个变通的办法. 哈哈哈.

// 找到一副牌中的一个对子时使用
static Pattern duiziZhengze = Pattern.compile( "((.)(\\2)) ");

// 验证一副牌中除了对子外. 其它的牌是否都是模子. 这时使用.
static Pattern[] moziZhengzeArr = {
Pattern.compile( "\1\2\3 "), // 123
Pattern.compile( "\1\1\2\2\3\3 "), // 123 123
Pattern.compile( "\1\1\1\2\2\2\3\3\3 "), //123 123 123
Pattern.compile( "\1\1\1\1\2\2\2\2\3\3\3\3 "), //123 123 123 123
Pattern.compile( "\1\2\2\3\3\4 "), //123 234
Pattern.compile( "\1\1\2\2\2\3\3\3\4 "), //123 123 234
Pattern.compile( "\1\2\2\2\3\3\3\4\4 "), //123 234 234
Pattern.compile( "\1\2\2\3\3\3\4\4\5 "), //123 234 345
Pattern.compile( "\1\1\1\2\2\2\2\3\3\3\3\4 "), //123 123 123 234
Pattern.compile( "\1\1\2\2\2\2\3\3\3\3\4\4 "), //123 123 234 234
Pattern.compile( "\1\2\2\2\2\3\3\3\3\4\4\4 "), //123 234 234 234
Pattern.compile( "\1\1\2\2\2\3\3\3\3\4\4\5 "), //123 123 234 345
Pattern.compile( "\1\2\2\3\3\3\3\4\4\4\5\5 "), //123 234 345 345
Pattern.compile( "\1\2\2\3\3\3\4\4\4\5\5\6 "), //123 234 345 456
Pattern.compile( "\1\2\2\2\3\3\3\3\4\4\4\5 "), //123 234 234 345
Pattern.compile( "\1\1\1 "), //111
Pattern.compile( "\1\2\2\2\2\3 "), //122223
};

static Pattern keziZhengze = Pattern.compile( "\1\1\1 "); // 111

//验证一副牌是否小七对使用
static Pattern qiduiZhengze = Pattern.compile( "((.)(\\2)){7} ");

//验证一副牌能不能胡
//办法是除掉对子看剩下的是否都是模子.
static boolean yanzheng(byte [] buf) {
Arrays.sort(buf);
String strbuf = new String(buf);

// 验证是否小七对
Matcher m7dui = qiduiZhengze.matcher(strbuf);
if (m7dui.matches())
return true;

Matcher m = duiziZhengze.matcher(strbuf);
int n = 0;
while (m.find(n)) {
// 删除找到的对子
// return 剩下的串是否是模子.
StringBuffer subbuf = new StringBuffer(strbuf);
subbuf.delete(m.start(), m.start() + 2);
if (yanzhengMozi(new String(subbuf))) {
return true;
}
n = m.end();
}
return false;
}

//验证参数buf中的元素是不是由模子们构成.
static boolean yanzhengMozi(String buf) {
if (buf.length() == 0) {
return true;
}

// 让buf从1开始(如将456变成123).
byte[] byteBufArr = buf.getBytes();
int n = byteBufArr[0] - 1;
for (int i=0; i <byteBufArr.length; ++i){
byteBufArr[i] -= n;
}
String buf1 = new String(byteBufArr);

// 如果第一张牌是风牌或剑牌则只验证是否刻子.
if (n + 1 > = TongxinChangliang.PAI_DONG) {
Matcher m = keziZhengze.matcher(buf1);
if (m.lookingAt())
return yanzhengMozi(buf.substring(m.end()));
else
return false;
}
else {
for (int i=0; i <moziZhengzeArr.length; ++i) {
Matcher m = moziZhengzeArr[i].matcher(buf1);