from collections import Counter


def 取相似度(
    文本1: str,
    文本2: str,
    匹配方式: int = 1,
) -> float:
    """
    计算两个文本之间的相似度，支持“顺序匹配”和“无序匹配”。

    功能说明：
        - 返回值范围为 [0.0, 1.0]，代表相似度；
        - 匹配方式 = 1：顺序匹配（按字符位置比较）；
        - 匹配方式 = 2：无序匹配（按字符出现次数比较，不关心顺序）；
        - 文本长度不同时，分母为两者最大长度；
        - 两个文本均为空时，相似度为 1.0；
        - 输入非法或出现异常时，返回 -1.0 作为失败标识。

    Args:
        文本1 (str): 第一个文本。
        文本2 (str): 第二个文本。
        匹配方式 (int):
            - 1：顺序匹配；
            - 2：无序匹配。

    Returns:
        float:
            - 成功：返回 0.0~1.0 之间的相似度；
            - 失败：返回 -1.0。

    Notes:
        - 顺序匹配用于对顺序敏感的场景；
        - 无序匹配用于“只关心包含哪些字符与数量”的场景；
        - 更复杂的文本相似度建议使用编辑距离或分词余弦相似度。
    """
    try:
        # 确保传入的能转成字符串
        文本1 = str(文本1)
        文本2 = str(文本2)

        长度1 = len(文本1)
        长度2 = len(文本2)
        最大长度 = max(长度1, 长度2)

        # 两者都为空 → 完全相同
        if 最大长度 == 0:
            return 1.0

        # ------- 匹配方式 1：顺序匹配 -------
        if 匹配方式 == 1:
            匹配数 = 0
            for i in range(最大长度):
                if i < 长度1 and i < 长度2 and 文本1[i] == 文本2[i]:
                    匹配数 += 1
            return 匹配数 / 最大长度

        # ------- 匹配方式 2：无序匹配 -------
        if 匹配方式 == 2:
            计数1 = Counter(文本1)
            计数2 = Counter(文本2)

            匹配字符总数 = 0
            for 字符, 次数1 in 计数1.items():
                匹配字符总数 += min(次数1, 计数2.get(字符, 0))

            return 匹配字符总数 / 最大长度

        # 匹配方式非法
        return -1.0

    except Exception:
        return -1.0