Skip to content

Latest commit

 

History

History

1487

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 
 
 

Given an array of strings names of size n. You will create n folders in your file system such that, at the ith minute, you will create a folder with the name names[i].

Since two files cannot have the same name, if you enter a folder name which is previously used, the system will have a suffix addition to its name in the form of (k), where, k is the smallest positive integer such that the obtained name remains unique.

Return an array of strings of length n where ans[i] is the actual name the system will assign to the ith folder when you create it.

 

Example 1:

Input: names = ["pes","fifa","gta","pes(2019)"]
Output: ["pes","fifa","gta","pes(2019)"]
Explanation: Let's see how the file system creates folder names:
"pes" --> not assigned before, remains "pes"
"fifa" --> not assigned before, remains "fifa"
"gta" --> not assigned before, remains "gta"
"pes(2019)" --> not assigned before, remains "pes(2019)"

Example 2:

Input: names = ["gta","gta(1)","gta","avalon"]
Output: ["gta","gta(1)","gta(2)","avalon"]
Explanation: Let's see how the file system creates folder names:
"gta" --> not assigned before, remains "gta"
"gta(1)" --> not assigned before, remains "gta(1)"
"gta" --> the name is reserved, system adds (k), since "gta(1)" is also reserved, systems put k = 2. it becomes "gta(2)"
"avalon" --> not assigned before, remains "avalon"

Example 3:

Input: names = ["onepiece","onepiece(1)","onepiece(2)","onepiece(3)","onepiece"]
Output: ["onepiece","onepiece(1)","onepiece(2)","onepiece(3)","onepiece(4)"]
Explanation: When the last folder is created, the smallest positive valid k is 4, and it becomes "onepiece(4)".

Example 4:

Input: names = ["wano","wano","wano","wano"]
Output: ["wano","wano(1)","wano(2)","wano(3)"]
Explanation: Just increase the value of k each time you create folder "wano".

Example 5:

Input: names = ["kaido","kaido(1)","kaido","kaido(1)"]
Output: ["kaido","kaido(1)","kaido(2)","kaido(1)(1)"]
Explanation: Please note that system adds the suffix (k) to current name even it contained the same suffix before.

 

Constraints:

  • 1 <= names.length <= 5 * 10^4
  • 1 <= names[i].length <= 20
  • names[i] consists of lower case English letters, digits and/or round brackets.

Related Topics:
Hash Table, String

Solution 1.

Store the smallest possible index of the name in a map m.

If the name doesn't exist in m, then we can safely use the name and set m[name] = 1 so that next time you come cross the same name, you can start from name + "(" + 1 + ")".

If the name already exist in m, instead of trying from 1 every time, we start trying from m[name]. The first name + "(" + index + ")" that doesn't show up in m will be the name we use. Then we set m[name] = index + 1, and m[name + "(" + index + ")"] = 1.

// OJ: https://leetcode.com/problems/making-file-names-unique/
// Author: github.com/lzl124631x
// Time: O(N)
// Space: O(N)
class Solution {
public:
    vector<string> getFolderNames(vector<string>& names) {
        int N = names.size();
        vector<string> ans(N);
        unordered_map<string, int> m;
        for (int i = 0; i < N; ++i) {
            auto &name = names[i];
            if (m.count(name) == 0) {
                ans[i] = name;
                m[name] = 1;
            } else {
                int index = m[name];
                while (true) {
                    auto n = name + "(" + to_string(index++) + ")";
                    if (m.count(n) == 0) {
                        ans[i] = n;
                        m[name] = index;
                        m[n] = 1;
                        break;
                    }
                }
            }
        }
        return ans;
    }
};