(C卷,100分)- 掌握的单词个数(Java & JS & Python & C)

题目描述

有一个字符串数组 words 和一个字符串 chars。

假如可以用 chars 中的字母拼写出 words 中的某个“单词”(字符串),那么我们就认为你掌握了这个单词。

words 的字符仅由 a-z 英文小写字母组成,例如 "abc"

chars 由 a-z 英文小写字母和 "?" 组成。其中英文 "?" 表示万能字符,能够在拼写时当作任意一个英文字母。例如:"?" 可以当作 "a" 等字母。

注意:每次拼写时,chars 中的每个字母和万能字符都只能使用一次。

输出词汇表 words 中你掌握的所有单词的个数。没有掌握任何单词,则输出0。

输入描述

第一行:输入数组 words 的个数,记作N。

第二行 ~ 第N+1行:依次输入数组words的每个字符串元素

第N+2行:输入字符串chars

输出描述

输出一个整数,表示词汇表 words 中你掌握的单词个数

备注

  • 1 ≤ words.length ≤ 100
  • 1 ≤ words[i].length, chars.length ≤ 100
  • 所有字符串中都仅包含小写英文字母、英文问号

用例

输入 4
cat
bt
hat
tree
atach??
输出 3
说明 可以拼写字符串"cat"、"bt"和"hat"
输入 3
hello
world
cloud
welldonehohneyr
输出 2
说明 可以拼写字符串"hello"和"world"
输入 3
apple
car
window
welldoneapplec?
输出 2
说明 可以拼写字符串"apple"和“car”

 

题目解析

本题可以分别统计出chars和word中各字符的数量,然后遍历word每个字符c,比较word和chars中统计的c字符数量,如果word的c数量超过了chars的c数量,那么就就将超出数量计入diff中。

最终比较diff和chars中万能字符‘?’的数量,如果chars中万能字符‘?’的数量 >= diff,那么说明chars可以使用万能字符补足不同部分,即可以学会word。

JS算法源码

const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;

void (async function () {
  const n = parseInt(await readline());

  const words = [];
  for (let i = 0; i < n; i++) words.push(await readline());

  const chars = await readline();

  console.log(getResult(words, chars));
})();

function getResult(words, chars) {
  let ans = 0;

  // 统计chars字符串中各字符的数量
  const cnt_chars = charStatistic(chars);

  for (let word of words) {
    let diff = 0;

    // 统计word字符串中各字符的数量
    const cnt_word = charStatistic(word);

    for (let j = 0; j < 128; j++) {
      // 记录word的某字符超过chars的对应字符出现的数量
      diff += Math.max(cnt_word[j] - cnt_chars[j], 0);
    }

    if (diff <= cnt_chars["?".charCodeAt()]) {
      ans++;
      // console.log(word);
    }
  }

  return ans;
}

function charStatistic(s) {
  const cnts = new Array(128).fill(0);

  for (let c of s) {
    cnts[c.charCodeAt()]++;
  }

  return cnts;
}

Java算法源码

import java.util.Scanner;

public class Main {
  public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    int n = sc.nextInt();

    String[] words = new String[n];
    for (int i = 0; i < n; i++) {
      words[i] = sc.next();
    }

    String chars = sc.next();

    System.out.println(getResult(words, n, chars));
  }

  public static int getResult(String[] words, int n, String chars) {
    int ans = 0;

    // 统计chars字符串中各字符的数量
    int[] cnt_chars = charStatistic(chars);

    for (int i = 0; i < n; i++) {
      int diff = 0;

      // 统计word字符串中各字符的数量
      int[] cnt_word = charStatistic(words[i]);

      for (int j = 0; j < 128; j++) {
        // 记录word的某字符超过chars的对应字符出现的数量
        diff += Math.max(cnt_word[j] - cnt_chars[j], 0);
      }

      if (diff <= cnt_chars['?']) {
        ans++;
        // System.out.println(words[i]);
      }
    }

    return ans;
  }

  public static int[] charStatistic(String s) {
    int[] cnts = new int[128];

    for (int i = 0; i < s.length(); i++) {
      char c = s.charAt(i);
      cnts[c] += 1;
    }

    return cnts;
  }
}

 

Python算法源码

# 输入获取
n = int(input())

words = []
for i in range(n):
    words.append(input())

chars = input()


def charStatistic(s):
    cnts = [0] * 128

    for c in s:
        cnts[ord(c)] += 1

    return cnts


# 算法入口
def getResult():
    ans = 0

    # 统计chars字符串中各字符的数量
    cnt_chars = charStatistic(chars)

    for word in words:
        diff = 0

        # 统计word字符串中各字符的数量
        cnt_word = charStatistic(word)

        for j in range(128):
            # 记录word的某字符超过chars的对应字符出现的数量
            diff += max(cnt_word[j] - cnt_chars[j], 0)

        if diff <= cnt_chars[ord('?')]:
            ans += 1
            # print(word)

    return ans


# 算法调用
print(getResult())

C算法源码

#include <stdio.h>
#include <stdlib.h>

#define MAX(a,b) ((a) > (b) ? (a) : (b))

int* charStatistic(const char* s) {
    int* cnts = (int*) calloc(128, sizeof(int));

    int i = 0;
    while(s[i] != '') {
        cnts[s[i]]++;
        i++;
    }

    return cnts;
}

int main() {
    int n;
    scanf("%d", &n);

    char words[100][101];

    for (int i = 0; i < n; i++) {
        scanf("%s", words[i]);
    }

    char chars[101];
    scanf("%s", chars);

    // 记录题解
    int ans = 0;

    // 统计chars字符串中各字符的数量
    int* cnts_char = charStatistic(chars);

    for(int i=0; i<n; i++) {
        int diff = 0;

        // 统计word字符串中各字符的数量
        int* cnt_word = charStatistic(words[i]);

        for(int j=0; j<128; j++) {
            // 记录word的某字符超过chars的对应字符出现的数量
            diff += MAX(cnt_word[j] - cnts_char[j], 0);
        }

        if(diff <= cnts_char['?']) {
            ans++;
            // puts(words[i]);
        }
    }

    printf("%dn", ans);
}

免责声明:

1、IT资源小站为非营利性网站,全站所有资料仅供网友个人学习使用,禁止商用
2、本站所有文档、视频、书籍等资料均由网友分享,本站只负责收集不承担任何技术及版权问题
3、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除下载链接并致以最深的歉意
4、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责
5、一经注册为本站会员,一律视为同意网站规定,本站管理员及版主有权禁止违规用户
6、其他单位或个人使用、转载或引用本文时必须同时征得该帖子作者和IT资源小站的同意
7、IT资源小站管理员和版主有权不事先通知发贴者而删除本文

0

评论0

站点公告

没有账号?注册  忘记密码?